为何用全零char数组构造的std::string长度与strlen结果不符?
关于std::string构造与strlen结果差异的问题
代码与输出
unsigned char buffer[0x4000] = {0}; string strText((char*)buffer, 0x4000); cout << "strlen((char*)buffer) = " << strlen((char*)buffer) << endl; cout << "strText.length() = " << strText.length() << endl;
输出结果:
strlen((char*)buffer) = 0 strText.length() = 16384
原因解释
1. strlen的行为逻辑
strlen是C标准库函数,它从传入的指针位置开始逐个检查字符,直到遇到第一个ASCII值为0的空字符(\0)就停止,返回此前统计的字符数量。你的buffer被全0初始化,第一个字符就是\0,所以strlen直接返回0,这完全符合预期。
2. std::string构造函数的选择
你使用的是std::string(const char* s, size_t n)这个重载构造函数,它的设计目的是处理包含空字符的二进制数据或非C风格字符串——它会直接把指针s指向的前n个字符全部复制到string对象中,不会因为遇到\0而停止。所以你传入了0x4000(即16384),string就会存储这16384个全0字符,length()自然返回构造时指定的长度。
3. cout输出空白的原因
cout输出std::string时,会逐个输出字符串中的字符。ASCII值为0的字符属于不可打印字符,很多终端会将这类不可打印字符显示为空格,所以你会看到一段很长的空白。
如何得到长度为0的std::string
如果你想让构造出的std::string长度和strlen结果一致(即到第一个\0为止),只需使用仅传入const char*的std::string构造函数:
string strText((char*)buffer);
这个构造函数会像strlen一样,遍历到第一个\0就停止复制,最终得到的string长度就是0。
内容的提问来源于stack exchange,提问作者Alex B.
相关产品推荐
相关产品推荐

