c++ - 关于零终止字符的混淆

标签 c++

我一直有一个关于 C++/C 中以 null 结尾的字符串的问题。例如,如果您有一个像这样的字符数组:

char a[10];

然后你想读这样的字符:

for(int i = 0; i < 10; i++)
{
  cin >> a[i]; 
}

然后让我们输入以下单词:提问者

作为输入。

现在我的问题是“\0”会发生什么?如果我要反转字符串,并使其打印出来

renoitseuq

空终止符去哪里了?我认为良好的编程习惯是始终为零终止字符留一个额外的字符。但在这个例子中,所有内容都被正确打印,那么为什么要关心空终止字符呢?只是好奇。感谢您的想法!

最佳答案

在某些情况下,您会得到一个空终止符,而在某些情况下,您必须自己请求一个。

const char* x = "bla";

是一个以 null 结尾的 C 风格字符串。它实际上有 4 个字符 - 3 + 空终止符。

您的字符串不是以 null 结尾的。事实上,将其视为空终止字符串会导致未定义的行为。如果你是cout <<如果是这样,您将尝试读取超出允许访问的内存的内容,因为运行时将继续寻找空终止符并吐出字符,直到达到 1。就你而言,你很幸运最后有一个,但这并不能保证。

char a[10];就像任何其他数组一样 - 未初始化的值,10 个字符 - 而不是 11 个字符,只是因为它是 char大批。你不会想到int b[10]包含 10 个可供您使用的值以及一个额外的 0最后只是因为,你愿意吗?

嗯,读回来,我不明白为什么你也希望 C 字符串也这么做 - 这并不完全直观。

关于c++ - 关于零终止字符的混淆,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14790958/

相关文章:

c++ - 这部分代码是什么意思?

c++ - 使用 gdb 检测 sh 中的段错误?

c++ - 静态成员和多线程

c++ - 将 vector<string> 转换为 vector<double> 的便捷方法

c++ - 在 C++ 中使用 SOIL 在屏幕中加载图片不起作用

c++ - 通过串联创建原始字符串时,是否会还原三字母替换?

c++ - Qt库,子类窗口拦截消息?

c++ - EMC++ 中提到的 "source object is lvalue"场景是什么,其中 move 语义没有提供效率增益

c++ - std::function 参数是不完整的类型,不允许

c++ - 类型对齐会修改字体大小吗?