我想在数组中一个接一个地输入16个字符…
#include<stdio.h>
void main(){
int i,j;
char a[4][4];
printf("Enter Values in array : ");
for ( i=0 ; i<=3 ; i++ )
{
for ( j=0 ; j<=3 ; j++ )
{
printf("a[%d][%d] : ",i,j);
scanf("%c",&a[i][j]);
}}
for ( i=0 ; i<=3 ; i++ )
{
for ( j=0 ; j<=3 ; j++ )
{
printf("a[%d][%d] : %cn",i,j,a[i][j]);
}}}
,输出为
a[0][0] : q
a[0][1] : a[0][2] : w
a[0][3] : a[1][0] : e
a[1][1] : a[1][2] : r
a[1][3] : a[2][0] : t
a[2][1] : a[2][2] : y
a[2][3] : a[3][0] : u
a[3][1] : a[3][2] : i
a[3][3] :
为什么我不能输入a[0][1],a[0][3]等等....为什么他们被跳过了…还有,请告诉我一个更好的方法来实现它…
scanf()将换行符留在输入缓冲区中,供后续调用使用。
告诉scanf()跳过空格
scanf(" %c",&a[i][j]); // Notice the space in the format string
格式说明符中的空格使scanf()在读取字符(对于%c
)之前忽略任何空白字符
这是在C语言中进行字符输入时的问题。当我们键入一个字符并按下ENTER键时,ENTER的ASCII值将成为下一次scanf的值。
你需要刷新stdin缓冲区,为此你应该写fflush(stdin)。
#include<stdio.h>
void main(){
int i,j;
char a[4][4];
printf("Enter Values in array : ");
for ( i=0 ; i<=3 ; i++ )
{
for ( j=0 ; j<=3 ; j++ )
{
printf("a[%d][%d] : ",i,j);
scanf("%c",&a[i][j]);
fflush(stdin);// will clear the input buffer stdin
}
}
for ( i=0 ; i<=3 ; i++ )
{
for ( j=0 ; j<=3 ; j++ )
{
printf("a[%d][%d] : %cn",i,j,a[i][j]);
}
}
}
KingsIndian的答案解释了这个问题。
作为解决方案,我将使用getchar()或getwchar()(参见第3节getchar)。通过每次读取一个字符,您可以:
-
检查您读取的字符是否属于您期望的类型(参见ctype.h或wctype.h)
-
丢弃你不想要的空格,CRs, LFs制表符等