加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

在c中附加到缓冲区

发布时间:2020-12-16 10:21:41 所属栏目:百科 来源:网络整理
导读:我试图有效地将地图的内容转换为字符串以通过套接字发送.到目前为止我有这个… char buffer[1024];for (iter = my_mapy.begin(); iter != my_map.end();iter++){ sprintf(buffer,"%s|%ld|%d",buffer,iter-first,iter-second);} 虽然这是有效的,但我想知道它
我试图有效地将地图的内容转换为字符串以通过套接字发送.到目前为止我有这个…

char buffer[1024];
for (iter = my_mapy.begin(); iter != my_map.end();iter++)
{
    sprintf(buffer,"%s|%ld|%d",buffer,iter->first,iter->second);
}

虽然这是有效的,但我想知道它是否效率低下. Google搜索将int / long / double转换为string的最有效方法导致了sprintf,这就是我使用它的原因.但我担心缓冲区的内容会被反复复制,而我只是想追加到最后.这是正确的,如果是这样,有没有更好的方法来做到这一点?性能和速度是第一优先.

谢谢!

解决方法

你是对的;你在这里提出的解决方案每次都会复制缓冲区.要做得更好,您必须使用sprintf的返回值.

char buffer[1024];
char* end_of_buffer = buffer;
std::size_t remaining_space = sizeof(buffer);

for (auto iter = my_map.begin(); iter != my_map.end(); iter++)
{
    int written_bytes = snprintf(end_of_buffer,remaining_space,"|%ld|%d",iter->second);

    if (written_bytes > 0) {
        end_of_buffer += written_bytes;
        remaining_space -= written_bytes;
    } else {
        perror("Something is wrong with the buffer");
    }
}

顺便提一下,我注意到我使用了snprintf,它跟踪缓冲区的剩余长度.您应该始终使用此而不是不安全的版本.您的应用程序将不断发展,通过极大的创造力,您将找到一种溢出此缓冲区的方法.同时安全性为零额外成本.

(当然,我的意思是没有冒犯.)

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读