【问题标题】:Interpretation of '\0' in C++C++中'\0'的解释
【发布时间】:2020-09-21 04:28:13
【问题描述】:
#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有什么区别?

【问题讨论】:

标签: c++ string


【解决方案1】:

字符串文字"abc\0defg"char const [9]std::string 没有接受数组的构造函数,但它可以接受 char const *。因此,当i 与该构造函数一起使用时,它认为字符串内的\0 表示字符串的结尾(实际上通常是如何计算char const * 字符串的结尾的)。所以i在构造时只包含abc

【讨论】:

  • 如果你想增加乐趣/混乱(取决于你的观点),请在初始化结束时输入using namespace std::string_literals; 并在末尾添加s,如string i = "abc\0defg"s;。 :)
  • 当这个数组衰减为char const *时,它只包含abc 嗯。我会说它有点复杂:char const* 是一个指针,它指向存储'a' 的地址。 abc\0defg\0 仍然存在,但(实际上)如果没有选项提供显式长度作为附加参数,每个标准 C 字符串函数将在第一个 \0c 之后)处停止。
  • ...这也是std::string::string(const char*) 中发生的情况。请注意,还有一个std::string::string(const char*, size_t) 可以用来代替:const char str[] = "abc\0defg"; string i(str, sizeof str - 1);- 1 用于剪切 second \0。)
  • @MohitSharma 这就是strings 的打印方式。 \0 不被视为 string 的结尾。
  • @MohitSharma 您可能想尝试问题中的代码,然后将cout &lt;&lt; x &lt;&lt; endl; 更改为cout &lt;&lt; x.c_str() &lt;&lt; endl;。如果不是空字符,则流式传输字符串将具有与流式传输其c_str() 相同的结果。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-05-27
  • 2012-12-10
  • 2014-02-06
  • 2012-02-07
  • 2011-08-12
  • 2014-03-15
  • 1970-01-01
相关资源
最近更新 更多