在字符串中使用空字符(C++)

ewo*_*wok 9 c++ arrays string null-character

我正在刷我的C++,偶然发现了一个关于字符串,字符数组和空字符('\0')的奇怪行为.以下代码:

#include <iostream>
using namespace std;

int main() {
    cout << "hello\0there"[6] << endl;

    char word [] = "hello\0there";
    cout << word[6] << endl;

    string word2 = "hello\0there";
    cout << word2[6] << endl;

    return 0;
}
Run Code Online (Sandbox Code Playgroud)

产生输出:

> t
> t
>
Run Code Online (Sandbox Code Playgroud)

幕后发生了什么?为什么字符串文字和声明的char数组存储't'at索引6(在内部之后'\0'),但声明的字符串不存在?

sea*_*ean 9

根据我的记忆,前两个本质上只是一个数组,打印字符串的方式是继续打印,直到\0遇到.因此,在前两个示例中,您从字符串中第6个字符的点偏移处开始,但在您的情况下,您将打印出第6个字符t.

string该类发生的是它将字符串的副本复制到它自己的内部缓冲区中,并通过将字符串从数组的开头复制到\0它找到的第一个字符串来实现.因此t它不会被存储,因为它来自第一个之后\0.

  • 作为旁注,如果他确实想要复制整个字符串,他可以使用`std :: string word3("hello\0there",11); (12认同)
  • 另外,对于“字符串”,您正在超出“字符串”内存的边界进行索引。你很幸运你的代码没有崩溃。 (2认同)

Oli*_*rth 5

因为std::string构造函数const char*将其参数视为C风格的字符串.它只是从它复制,直到它达到空终止符,然后停止复制.

所以你的最后一个例子实际上是调用未定义的行为; word2[6]超过了字符串的结尾.