在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,它跟踪缓冲区的剩余长度.您应该始终使用此而不是不安全的版本.您的应用程序将不断发展,通过极大的创造力,您将找到一种溢出此缓冲区的方法.同时安全性为零额外成本. (当然,我的意思是没有冒犯.) (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |