1

我想在一个数组中一个一个地输入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] : %c\n",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] 等等....为什么它们被跳过...还请告诉一个更好的方法来完成这项工作...

4

3 回答 3

6

scanf() 将换行符留在输入缓冲区中,供后续调用使用。

告诉 scanf() 跳过空格。

scanf(" %c",&a[i][j]); // Notice the space in the format string

格式说明符中的空格使 scanf() 在读取字符之前忽略任何空白字符(for %c

于 2013-04-13T09:02:11.687 回答
2

这是在 C 语言中进行字符输入时的问题。当我们键入一个字符并按 ENTER 键时,ENTER 的 ASCII 值将成为下一个 scanf 的值。

您需要刷新标准输入缓冲区,为此您应该编写 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] : %c\n",i,j,a[i][j]);
    }
    }
    }
于 2013-04-13T09:30:56.193 回答
2

KingsIndian 的回答解释了这个问题。

作为一种解决方案,我会使用 getchar() 或 getwchar()(参见 man 3 getchar)。通过一次阅读角色广告,您可以:

  1. 检查您阅读的字符是否属于您所期望的类型(参见 ctype.h 或 wctype.h)

  2. 丢弃你不想要的那些,比如空白、CR、LF 选项卡等。

于 2013-04-13T09:13:13.753 回答