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