二维数组中缺少最后一个元素
Last element is missing from the 2D array
代码:
#include <stdio.h>
int main(){
int num;
scanf("%d", &num);
printf("Enter: ");
char nums[5][num], ch;
for(int i = 0; i < num; i++){
for(int j = 0; j < 5; j++){
if((ch = getchar()) != '\n'){
nums[j][i] = ch;
}
}
}
for(int i = 0; i < num; i++){
for(int j = 0; j < 5; j++){
printf("%c ", nums[j][i]);
}
printf("\n");
}
return 0;
}
输出:
1
Enter: 12345
1 2 3 4
Process returned 0 (0x0) execution time : 6.282 s
Press ENTER to continue.
为什么数组输出的最后一个元素少了,在开头多了space?
如果我将两个 for 循环中 j 的范围更改为
j <= 5
然后,输出如下所示:
1
Enter: 12345
1 2 3 4 5
Process returned 0 (0x0) execution time : 2.107 s
Press ENTER to continue.
如果在 printf 循环中 j 的初始值为 1,则输出如下所示:
1
Enter: 12345
1 2 3 4 5
Process returned 0 (0x0) execution time : 3.675 s
Press ENTER to continue.
数组输出的开头没有多余的空隙。
谁能解释一下这个问题以及如何解决这个问题?
问题是函数 getchar
从输入流中读取所有字符,包括在第一次调用 scanf
后存储在缓冲区中的换行符。
所以在循环中读取的第一个字符是换行符'\n'
。
例如,您应该通过以下方式将其删除。
scanf( "%*[^\n]" );
scanf( "%*c" );
你在第一个循环中有逻辑问题。您测试了 \n
,但是如果您确实找到了 \n
,您将保持数组条目未初始化并继续进行下一个条目。这会导致虚假输出。
相反,您可以延迟 j++
直到获得有效字符,例如:
for(int i = 0; i < num; i++){
for(int j = 0; j < 5; ){
if((ch = getchar()) != '\n'){
nums[j][i] = ch;
++j;
}
}
}
然后数组将被输入的非换行符填充,你不需要做任何其他的flushling。
它会改进代码以同时检查 ch != EOF
(并且 ch
应该声明为 int
),但是您将需要一些错误处理(这将是一个错误只是打破循环并继续尝试输出整个数组)。
代码:
#include <stdio.h>
int main(){
int num;
scanf("%d", &num);
printf("Enter: ");
char nums[5][num], ch;
for(int i = 0; i < num; i++){
for(int j = 0; j < 5; j++){
if((ch = getchar()) != '\n'){
nums[j][i] = ch;
}
}
}
for(int i = 0; i < num; i++){
for(int j = 0; j < 5; j++){
printf("%c ", nums[j][i]);
}
printf("\n");
}
return 0;
}
输出:
1
Enter: 12345
1 2 3 4
Process returned 0 (0x0) execution time : 6.282 s
Press ENTER to continue.
为什么数组输出的最后一个元素少了,在开头多了space?
如果我将两个 for 循环中 j 的范围更改为
j <= 5
然后,输出如下所示:
1
Enter: 12345
1 2 3 4 5
Process returned 0 (0x0) execution time : 2.107 s
Press ENTER to continue.
如果在 printf 循环中 j 的初始值为 1,则输出如下所示:
1
Enter: 12345
1 2 3 4 5
Process returned 0 (0x0) execution time : 3.675 s
Press ENTER to continue.
数组输出的开头没有多余的空隙。
谁能解释一下这个问题以及如何解决这个问题?
问题是函数 getchar
从输入流中读取所有字符,包括在第一次调用 scanf
后存储在缓冲区中的换行符。
所以在循环中读取的第一个字符是换行符'\n'
。
例如,您应该通过以下方式将其删除。
scanf( "%*[^\n]" );
scanf( "%*c" );
你在第一个循环中有逻辑问题。您测试了 \n
,但是如果您确实找到了 \n
,您将保持数组条目未初始化并继续进行下一个条目。这会导致虚假输出。
相反,您可以延迟 j++
直到获得有效字符,例如:
for(int i = 0; i < num; i++){
for(int j = 0; j < 5; ){
if((ch = getchar()) != '\n'){
nums[j][i] = ch;
++j;
}
}
}
然后数组将被输入的非换行符填充,你不需要做任何其他的flushling。
它会改进代码以同时检查 ch != EOF
(并且 ch
应该声明为 int
),但是您将需要一些错误处理(这将是一个错误只是打破循环并继续尝试输出整个数组)。