问题在于,函数getchar
从输入流中读取所有字符,包括在第一次调用scanf
之后存储在缓冲区中的换行符。
因此循环中读取的第一个字符是换行符'\n'
。例如,您应该通过以下方式将其删除。
代码:
#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.
在数组输出的开头没有多余的间隙。
任何人都可以解释这以及如何解决此问题吗?
代码:#include
问题在于,函数getchar
从输入流中读取所有字符,包括在第一次调用scanf
之后存储在缓冲区中的换行符。
因此循环中读取的第一个字符是换行符'\n'
。例如,您应该通过以下方式将其删除。
scanf( "%*[^\n]" );
scanf( "%*c" );
j++
可以从for
循环移到if
的主体中。getchar
返回int
,因此请使用int ch
而不是char
。
#include <stdio.h>
int main ( ) {
int num = 0;
scanf("%d", &num);
printf("Enter: ");
fflush ( stdout);
char nums[5][num];
int ch = 0;
for(int i = 0; i < num; i++){
for(int j = 0; j < 5; ){
if((ch = getchar()) != '\n'){
nums[j][i] = ch;
j++;// move j++ to here
}
}
}
for(int i = 0; i < num; i++){
for(int j = 0; j < 5; j++){
printf("%c ", nums[j][i]);
}
printf("\n");
}
return 0;
}
问题在于,函数getchar
从输入流中读取所有字符,包括在第一次调用scanf
之后存储在缓冲区中的换行符。
因此循环中读取的第一个字符是换行符'\n'
。例如,您应该通过以下方式将其删除。
j++
可以从for
循环移到if
的主体中。getchar
返回int
,因此请使用int ch
而不是char
。