c++:关于空字符



有两个string变量,mn:

#include <string>
string m = "0100700"
cout << m.size() << endl; // it prints: 7
string n;
n += "0100700"
n += '';
cout << n.size() << endl; // it prints: 8

我假设两者都有8个字符,但m只有7个字符,n有8个字符。为什么会这样呢?

首先要注意的是,std::string没有可以从底层数组推断字符串文本长度的构造函数。它所拥有的是一个构造函数,该构造函数接受const char*并将其视为以空结尾的字符串。在此过程中,它会复制字符,直到找到第一个

这是string m = "0100700";中使用的构造函数,这就是为什么在第一种情况下字符串的长度为7。请注意,没有其他方法可以从指向char数组第一个元素的指针获取char数组的长度。

在第二个示例中,将一个字符添加到先前存在的长度为7的std::string对象中。这将长度增加到8。如果要遍历字符串的元素,您将能够看到第8个元素是''

for (auto c: n)
    if (c == 0) std::cout << "null terminator" << std::endl;

为了初始化包含''字符的字符串,您有以下选项:

使用初始化列表

std::string s{'a', 'b', '', 'd', 'e', '', 'g'};

使用std::string的迭代器构造函数从不同的容器或数组中构造:

std::vector<char> v{'a', 'b', '', 'd', 'e', '', 'g'};
char c[] = {'a', 'b', '', 'd', 'e', '', 'g'};
const char* ps = "abdeg";
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";

string变量是由一个字符字面量构造的,它接受找到的第一个''字符之前的所有字符。

然而,第二个示例显示,您可以向std::string添加任意数量的额外''字符并增加其大小。


回答你评论中的问题:

要从包含''字符的字面值初始化字符串,您可以显式指定计数

string m("0100700",8);

或者可以使用firstlast迭代器的构造函数:

 const char x[] = "0100700";
 string m(std::begin(x),std::end(x));

相关内容

  • 没有找到相关文章

最新更新