有两个string
变量,m
和n
:
#include <string>
string m = "0100700\0"
cout << m.size() << endl; // it prints: 7
string n;
n += "0100700"
n += '\0';
cout << n.size() << endl; // it prints: 8
我认为两者都有8个字符,但m
只有7个字符而n
有8个字符。为什么会这样?
答案 0 :(得分:10)
首先要注意的是std::string
没有可以从底层数组推断字符串文字长度的构造函数。它有一个接受const char*
的构造函数,并将其视为以null结尾的字符串。在这样做时,它会复制字符,直到找到第一个\0
。
这是string m = "0100700\0";
中使用的构造函数,这就是为什么在第一种情况下你的字符串长度为7.注意,没有其他方法可以将char数组的长度从指向它的第一个获取元件。
在第二个示例中,您将一个字符添加到长度为7的预先存在的std::string
对象中。这会将长度增加到8.如果要迭代字符串的元素,您将能够看到这个第8个元素是'\0'
。
for (auto c: n)
if (c == 0) std::cout << "null terminator" << std::endl;
要初始化包含'\0'
个字符的字符串,您可以选择:
使用初始化列表:
std::string s{'a', 'b', '\0', 'd', 'e', '\0', 'g'};
使用std::string
的迭代器构造函数从不同的容器或数组构造:
std::vector<char> v{'a', 'b', '\0', 'd', 'e', '\0', 'g'};
char c[] = {'a', 'b', '\0', 'd', 'e', '\0', 'g'};
const char* ps = "ab\0de\0g";
std::string s0(std::begin(v), std::end(v));
std::string s1(std::begin(c), std::end(c));
std::string s2(ps, ps + 8);
答案 1 :(得分:8)
在第1个样本中
string m = "0100700\0";
string
变量是从字符文字构造的,并且将所有字符都带到找到的第一个'\0'
字符。
然而,第二个示例显示,您可以向'\0'
添加任意数量的其他std::string
字符并增加其大小。
回答你的评论中的问题:
要从包含'\0'
个字符的文字初始化字符串,您可以明确指定计数
string m("0100700\0",8);
或者您可以使用构造函数使用first
和last
迭代器:
const char x[] = "0100700\0";
string m(std::begin(x),std::end(x));