char数组的输出

时间:2016-03-17 22:15:53

标签: c++ arrays char output

有人可以解释为什么我得到这个奇怪的输出?

为什么每次只输出一个arr[b]

123.in

2
QWERT
YUIOP
ASDFG
HJKLZ
XCVBN
QWERT
YUIOP
ASDFG
HJKLZ
XCVBN


Main.cpp的

int main() {
int n;
char arr[5][5];
    ifstream source;
    source.open("123.in");

source >> n;
for(int i=0; i<=n; i++) {
    for(int r=0; r<5; r++){
            source >> arr[r];
            cout << arr[r] << endl;
    }
    for(int b=0; b<5; b++)
        cout << " WHY: " << arr[b]<< endl;
}
source.close();
    return 0;
}


输出

QWERT
YUIOP
ASDFG
HJKLZ
XCVBN
 WHY: QWERTYUIOPASDFGHJKLZXCVBN
 WHY: YUIOPASDFGHJKLZXCVBN
 WHY: ASDFGHJKLZXCVBN
 WHY: HJKLZXCVBN
 WHY: XCVBN

为什么cout << arr[r] << endl;cout << " WHY: " << arr[b]<< endl;不会输出相同的代码?

2 个答案:

答案 0 :(得分:5)

您的数据存储方式如下:

ARR:

[0][0]  [0][1] [0][2]  [0][3]  [0][4]  [1][0]  [1][2]  [1][3]  [1][4]  [2][0]  [2][1]  [2][2]  [2][3]  [2][4]  [3][0]  [3][1]  [3][2]  [3][3]  [3][4]  [4][0]  [4][1]  [4][2]  [4][3]  [4][4]  [][]

Q     | W     | E     | R     | T     | Y     | U     | I     | O     | P     | A     | S     | D     | F     | G     | H     | J     | K     | L     | Z     | X     | C     | V     | B     | N    

当你说你想要

cout << arr[3];

这意味着开始在&#34; arr [3] [0]&#34;并继续直到你点击NULL字符。 &#34; ARR [数字]&#34;实际上是指向另一个数组的指针。因为所有的数组都是同时初始化的(char arr [5] [5];)它将数组放回到内存中。

例如,如果你这样做:

cout << arr[0][7] << endl;

你会得到&#34;我&#34;作为输出,因为它从&#34; arr&#34;指针,从[0] [0]开始,恰好落在&#34; I&#34;

〜按要求编辑:

请注意,当您使用指针(c ++中的数组确实是这样)时,很容易忽略&#39; \ 0&#39;终止数组的字符。在你的例子中,你很幸运,下一个字符是NULL,但情况并非总是这样。字符串可以继续显示存储在内存中的随机字符,直到它出现在NULL字符上。最佳实践涉及跟踪阵列的大小,以确保不会发生无意的结果。

答案 1 :(得分:0)

C ++期望你的C字符串(char数组)以特殊的&#34;行结束&#34;结束。符号(您可以将其转义为&#39; \ 0&#39;)。由于你将每个5个字母的字符串填充到边缘,因此它不知道何时停止阅读。例如,&#34; QWERT&#34;将表示为6个字符而不是5个字符:

&#39; Q&#39;,&#39; W&#39;,&#39; E&#39;,&#39; R&#39;&#39; T&#39;,&# 39; \ 0&#39;

当cout开始阅读时,它找不到最后一个字符,因此它会继续读取以下记忆位置。在这种情况下,下一行:&#34; YUIOP&#34;。等等。