[英]Why is a char[] array '\0' terminated by std::cin?
int main() {
char suffix[25];
cout<<"Enter some suffix: ";
cin >> suffix;
cout << endl <<suffix;
}
查看完整样本
输入:
dog
输出:
dog
预期输出:
dog#*(!&!XΓ◘♪<♣@!(!)XΓ◘♪<♣☺XΓ◘♪<♣
我缺少的关于指针的基本要点是什么(如果实际上确实与指针有关)以及它们完全保留给出的内容的能力? 甚至一个strlen的(后缀)产生3,当我希望它是25打印后缀[6]中,例如,在所有的打印无关,甚至没有空间
当您使用cin
和cout
读写char*
时,会将其视为C风格的字符串。 cin
在该行的末尾添加了一个空终止符,而cout
只写直到到达空终止符为止。 strlen()
计算字符,直到终止符为空。
suffix[6]
将包含分配数组时该字节中发生的任何随机垃圾。 如果您没有看到cout << suffix[6]
任何内容,那是因为随机垃圾恰好是一个非打印字符。
带有char*
右操作数的<<
运算符从流中读取并将C样式的字符串写入指定的数组。 ( char*
值是数组表达式suffix
的隐式转换的结果。)
它将终止的空字符'\\0'
到数组中以标记字符串的结尾。 '\\0'
之后的数组内容将保留。
strlen
和cout << suffix
都将查找此终止符,以确定字符串的长度。
至于suffix[6]
,它是数组的有效元素,但超出了字符串的末尾。 它的内容是垃圾。 尽管没有确定,但很有可能包含一个空字符。 打印它可能没有可见的效果。 如果将其转换为int
,则可以看到实际值。
cin
在“ dog”之后安装了null; 结果, cout
停止在“ dog”之后显示字符。 这是通过c ++方法识别字符串结尾的。
这里没有指针
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.