假设我有 char buffer[64]
和 uint32_t length
,buffer
可能以也可能不以 null 终止。如果它以空值终止,则缓冲区的其余部分将填充空值。 length
变量保存缓冲区的长度。
我想将它复制到 std::string
中,在字符串对象的末尾没有额外的空值。
最初,我尝试过:
std::string s(buffer, length);
当缓冲区最后充满空值时复制额外的空值。
我能想到的:
char buffer2[128];
strncpy(buffer2, buffer, 128);
const std::sring s(buffer2);
但它有点浪费,因为它复制了两次。
不知道有没有更快的方法。我知道我需要进行基准测试才能准确判断哪种方式更快……但我想看看其他一些解决方案,然后再进行基准测试……
提前致谢。
最佳答案
如果可以的话,我会在缓冲区的末尾添加一个
'\0'
并且 然后使用string
构造函数的 c 字符串版本。如果你不能,你需要确定你的代码中是否有
'\0'
缓冲区,当你在它的时候,你不妨数一数'\0'
之前遇到的字符。然后你可以使用它 使用string
构造函数的(buffer,length)
形式计数:#include <string.h> //... std::string s(buffer, strnlen(buffer, length));
如果您不能执行 1. 并且不想遍历
buffer
两次(一次确定长度,一次在字符串构造函数中),您可以这样做:char last_char = buffer[length-1]; buffer[length-1] = '\0'; std::string s(buffer); //the c-string form since we're sure there's a '\0' in the buffer now if(last_char!='\0' && s.length()==(length-1)) { //With good buffer sizes, this might not need to cause reallocation of the strings internal buffer s.push_back(last_char); }
我把基准测试留给你了。构造函数的 c-string 版本有可能在内部使用类似
strlen
的东西来避免重新分配,因此使用c-string
版本可能没有太多好处string
构造函数。
关于linux - 将缓冲区或 C 字符串复制到 std::string 的最快方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26176357/