【问题标题】:CPP string constructor find and append null charactersCPP 字符串构造函数查找并附加空字符
【发布时间】:2013-04-18 15:28:12
【问题描述】:

在 C++ 中,strings 被复制,直到在输入字符序列时接收到 NULL 字符。但是,如果您提供要读取的字符数,它会复制到NULL 字符之外吗?我有一种情况,我可能会收到一条中间有一个 NULL 字符的消息,并且在它之后仍然有用信息。同样的问题也适用于追加。

find() 类似,如果遇到NULL 字符,它会停止搜索吗?

【问题讨论】:

  • 如果你说的是std::string,那么是的,他们可以在中间有\0。 std::string 不使用“以 \0 结尾”约定。他们有存储大小的内存。所以它们可以用作缓冲区。

标签: c++ string stdstring


【解决方案1】:

您应该能够构造一个包含'\0' 字符的字符串:

const char a[] = "Hello\0world";
std::string s(a, sizeof(a));

std::cout << "a = \"" << a << "\"\n";
std::cout << "s = \"" << s << "\"\n";
std::cout << "sizeof(a)  = " << sizeof(a) << '\n';
std::cout << "strlen(a)  = " << std::strlen(a) << '\n';
std::cout << "s.length() = " << s.length() << '\n';

上面的sn-p会打印出来

a = "你好" s = "你好世界" 大小(a) = 12 strlen(a) = 5 s.length() = 12

【讨论】:

  • s 的输出是否也包含空字符,还是只删除空字符?
  • @legion 这是一个很好的问题,我目前不知道答案。将不得不检查它。
  • 有趣的结果! std::string 不知道 \0 作为字符串终止符! 糟糕的 C 风格字符串 :-D
  • @legion 根据this reference,字符串的输出运算符使用整个字符串调用std::basic_streambuf::sputn,包括嵌入的'\0'。我的猜测是 '\0' 在库将字符串写入操作系统后被删除。
  • @MM。 std::string 不关心 C 风格的终止符,而是有它的长度。如果您不提供构造长度,那么字符串当然会通过查找 C 样式的终止符来推断它。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-02-18
  • 2012-09-07
  • 2014-11-21
  • 2017-07-26
  • 2022-01-16
相关资源
最近更新 更多