c++ - 带有空字符的 std::string 是否可能?

标签 c++

我用字符串文字初始化了一个 C++ 字符串,并用 NULL 替换了一个 char。

当用 cout << 打印时打印完整字符串,NULL 字符打印为空白。

当打印为 c_str 时字符串打印按预期在 NULL 字符处停止。

我有点困惑。该 Action 是否来自 cout ?或 string

int main(){
  std::string a("ab0cd");
  a[2] = '\0'; // '\0' is null char

  std::cout << a << std::endl; // abcd
  std::cout << a.c_str() << std::endl; // ab
}

测试一下 online .

不知道是不是环境有关,反正我是在Windows 10下用VSCode工作

最佳答案

首先,您可以将程序缩小到以下范围:

#include <iostream>
#include <string>

int main(){
    std::string a("ab0cd");
    a[2] = '\0'; // replace '0' with '\0' (same result as NULL, just cleaner)

    std::cout << a << "->" << a.c_str();
}

这打印

abcd->ab

那是因为 std::string 的长度是已知的。所以它会打印它的所有字符,并且在遇到空字符时不会停止。空字符'\0'(相当于NULL的值[都是0,类型不同]),是不可打印的,所以你只看到 4 个字符。 (但这取决于您使用的终端,有些可能会打印占位符)

const char* 表示(通常)一个以 null 结尾的字符串。因此,当打印 const char* 时,它的长度未知并且会打印字符,直到遇到空字符。

关于c++ - 带有空字符的 std::string 是否可能?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59528273/

相关文章:

c++ - 大数据阵列 MPI 发送

c++ - 默认情况下应调用 move 构造函数

c++ - 在我的 Mac OSX El Capitan 上编译带有意外错误的简单 C++ 类

c++ - 在 KDevelop C++ 中启用 pretty-print

c++ - 除以整数保证产生相同的 float ?

c++ - 我在 Clang 中发现错误了吗?

c++ - "atomic object"的定义

c++ - 如何为 wxWidgets 编写 GUI 测试

c++ - 我应该如何向开发人员提供库二进制文件?

c++ - constexpr函数: gcc/msvc vs clang/icc [duplicate]的const引用参数