char数组的输出

Pio*_* K. 1 c++ arrays char output

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

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

123.in

2
QWERT
YUIOP
ASDFG
HJKLZ
XCVBN
QWERT
YUIOP
ASDFG
HJKLZ
XCVBN
Run Code Online (Sandbox Code Playgroud)


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;
}
Run Code Online (Sandbox Code Playgroud)


产量

QWERT
YUIOP
ASDFG
HJKLZ
XCVBN
 WHY: QWERTYUIOPASDFGHJKLZXCVBN
 WHY: YUIOPASDFGHJKLZXCVBN
 WHY: ASDFGHJKLZXCVBN
 WHY: HJKLZXCVBN
 WHY: XCVBN
Run Code Online (Sandbox Code Playgroud)

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

brw*_*w59 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    
Run Code Online (Sandbox Code Playgroud)

当你说你想要的时候

cout << arr[3];
Run Code Online (Sandbox Code Playgroud)

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

例如,如果你这样做:

cout << arr[0][7] << endl;
Run Code Online (Sandbox Code Playgroud)

你将得到"I"作为输出,因为它从"arr"指针开始计数7,该指针从[0] [0]开始,恰好落在"I"上

〜根据要求编辑:

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