有人可以解释为什么我得到这个奇怪的输出?
为什么每次只输出一个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;
不会输出相同的代码?
答案 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;。等等。