gpt4 book ai didi

C++:关于空字符

转载 作者:可可西里 更新时间:2023-11-01 15:04:07 26 4
gpt4 key购买 nike

有两个string变量,mn:

#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 个字符。为什么会这样?

最佳答案

首先要注意的是 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);

关于C++:关于空字符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30272667/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com