在C++中,'\0'的含义是什么?

4
#include<iostream>
#include<string>
using namespace std;
int main(){
    string i = "abc\0defg";
    cout<<i<<endl;
    // This prints "abc"

    string x = "abcdefg";
    x[3]='\0';
    cout << x << endl;
    // This prints "abcefg"
}

我知道 C++ String 类的实例 i 不会将 \0 解释为字符串的结尾。为什么字符串 i 在遇到 \0 后面的一切都被省略了? 字符串 ix 有什么区别?


1
std::string没有以null结尾。https://dev59.com/m2gt5IYBdhLWcg3w3xPC - schorsch312
1个回答

6
字符串常量 "abc\0defg" 是一个 char const [9]std::string 没有接受数组的构造函数,但可以接受 char const *。因此,当使用该构造函数时,它认为字符串中的 \0 表示字符串的结束(这通常是计算 char const * 字符串结尾的方法)。因此,在构造 i 时,它仅包含 abc

如果你想增加一些有趣/混乱(取决于你的观点),可以加入 using namespace std::string_literals; 并在初始化末尾加上 s,例如 string i = "abc\0defg"s;。 :) - JaMiT
1
当这个数组被衰变为一个 char const * 时,它只包含 abc。嗯,我会说得更加复杂一些:char const* 是一个指针,它指向存储 'a' 的地址。abc\0defg\0仍然存在,但是(实际上)每个标准的 C 字符串函数都会在第一个 \0(在 c 后面)停止,除非提供了显式长度作为附加参数的选项。 - Scheff's Cat
1
...并且std::string::string(const char*)也是这样的。请注意,还有一个可以使用的 std::string::string(const char*, size_t)const char str[] = "abc\0defg"; string i(str, sizeof str - 1);- 1 的目的是为了去掉第二个 \0)。 - Scheff's Cat
1
@MohitSharma 这就是string字符串的打印方式。\0并不被视为string字符串的结尾。 - cigien
1
@MohitSharma 你可能想尝试一下问题中的代码,然后将 cout << x << endl; 改为 cout << x.c_str() << endl;。如果不是因为空字符,流输出一个字符串将会与流输出它的 c_str() 相同的结果。 - JaMiT
显示剩余6条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接