为什么char []数组' \ 0'由std :: cin终止?

时间:2014-11-21 01:08:10

标签: c++ arrays

int main() {
    char suffix[25];
    cout<<"Enter some suffix: ";
    cin >> suffix;
    cout << endl <<suffix;
}

请参阅 full sample

输入:

dog

输出:

dog

预期产出:

dog#*(!&!XΓ◘♪<♣@!(!)XΓ◘♪<♣☺XΓ◘♪<♣

我错过了关于指针的基本要素(如果这实际上与指针有关)以及它们能够准确保留给出的内容的能力是什么?即使strlen(后缀)产生3,当我期望它为25.打印后缀[6],例如,什么都不打印,甚至不打印空间

3 个答案:

答案 0 :(得分:3)

当您使用char*cin读取或写入cout时,会将其视为C风格的字符串。 cin在行的末尾添加一个空终止符,cout只会写入,直到它到达null终止符。 strlen()计算字符直到空终止符。

suffix[6]将包含分配数组时该字节中发生的任何随机垃圾。如果你没有看到cout << suffix[6]的任何内容,那是因为随机垃圾恰好是非打印字符。

答案 1 :(得分:1)

具有<<右操作数的char*运算符从流中读取并将C样式字符串写入指定的数组。 (char*值是数组表达式suffix的隐式转换的结果。)

它将终止空字符'\0'存储到数组中以标记字符串的结尾。 '\0'之后的数组内容是单独的。

strlencout << suffix都会查找此终结符以确定字符串的持续时间。

至于suffix[6],它是数组的有效元素,但它超出了字符串的结尾。它的内容是垃圾。尽管不是很确定,但它很可能包含一个空字符;打印它可能没有明显的效果。如果将其转换为int,则可以看到实际值。

答案 2 :(得分:1)

cin在&#34; dog&#34 ;;之后安装null。结果cout在&#34; dog&#34;之后停止显示字符。这是通过c ++方法识别字符串的结尾。

这里没有指针