【发布时间】:2020-02-11 19:18:03
【问题描述】:
代码:
#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.
为什么最后一个元素不见了,而数组输出的开头又多了一个空格?
如果我将两个 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留下的换行符。将其替换为scanf("%d ", &num);(注意空格)。 -
一般情况下,您应该避免将
scanf与其他输入法一起使用。如果您使用scanf读取数字(使用"%d"),那么您应该使用scanf读取字符(使用" %c")。注意%c之前的空格。 -
@EugeneSh。 scanf 中的尾随空格是个坏主意,这意味着输入将阻塞,直到他们键入另一个非空白项
-
通常,在 C 中,如果你有一个二维数组
SomeType array[5][num];,你的循环将在尾随索引之前的前导索引上工作:for (int i = 0; i < 5; i++) { for (int j = 0; j < num; j++) { …array[i][j]… },但你的代码可以使用索引其他方式 - 所以你填充列而不是行。这不是自动错误的,但它在 C 中是不常见的(尽管 Fortran 的工作方式)。您可以查找“列主要”和“行主要”索引 - 例如,请参阅 Wikipedia on Row-Major and Column-Major Order。
标签: c multidimensional-array 2d fflush