C语言中的字符数组清空

4

代码

int main()
{
     int n,m,i,j;char a[10][10];
     printf("enter n and m values\n");     
     scanf("%d%d",&n,&m);

     printf("enter array values");    
     for(i=0;i<n;i++)
        for(j=0;j<m;j++)
          scanf("%c",&a[i][j]);

     printf("the array is \n");
     for(i=0;i<n;i++)
        for(j=0;j<m;j++)
          printf("%d %d %c\t",i,j,a[i][j]);
}

输入

 Enter n and m values  
 4 5
 Enter characters 
 11111000001111100000

输出

0 0 

0 1 1   0 2 1   0 3 1   0 4 1   1 0 1   1 1 0   1 2 0   1 3 0   1 4 0   2 0 0    
2 1 1   2 2 1   2 3 1   2 4 1   3 0 1   3 1 0   3 2 0   3 3 0   3 4 0   

错误

如果我将n的值设为4,m的值设为5,scanf就会正常运行。

但是在打印时,当i的值为0且j的值为0时,它不会打印任何内容。

与此同时,a[0][1]打印第一个输入,a[0][2]打印第二个输入,依次类推,所以最后一个输入0在打印时被跳过了。

请解释一下为什么要避免a[0][0]。


很可能在缓冲区中留下了一个回车符(因为您只使用scanf()读取了2个整数),并且它被分配给了[0][0]。在使用scanf读取任何字符之前,尝试使用fflush(stdout) - sherrellbc
谷歌搜索的第二个结果:http://gsamaras.wordpress.com/code/caution-when-reading-char-with-scanf-c/ - Maxime Chéramy
3
我不认为 fflush(stdout) 会对 stdin 产生影响。 - chux - Reinstate Monica
@chux,当然不是。我的错误。应该是 stdin - sherrellbc
3
不应该执行stdin的刷新,详情可参考此链接:http://www.c-faq.com/stdio/stdinflush.html。 - haccks
1
提示:始终检查任何 scanf 函数的返回值。如果它小于您期望的值,并且您没有处理它,那么结果可能不会很好。 - hyde
1个回答

5

之前使用 scanf 函数时,输入缓冲区中会留下一个 \n 字符,这个字符通常是由于按下 EnterReturn 键所导致的。在第一次迭代时,scanf("%c",&a[i][j]); 会读取到这个 \n 字符。

为了解决这个问题,你需要清空输入缓冲区。可以在 scanf%c 前面加上一个空格来实现。

scanf(" %c", &a[i][j]);   
       ^A space before `%c` can skip any number of leading white-spaces

或者你可以使用
int c;
while((c = getchar()) != '\n' && c != EOF);  

注意:在这种情况下,fflush(stdin)会起作用吗?

fflush 仅用于输出流。由于其“刷新”的定义是完成缓冲字符的写入(而不是丢弃它们),因此在输入流上将未读取的输入丢弃不是 fflush 的类似含义。

建议阅读:c-faq 12.18


我查看了scanf的文档,它会忽略任何空格,直到读取format(在这种情况下是一个字符)。那么空格到底有什么作用? - sherrellbc
@sherrellbc;已更新答案。 - haccks
1
@sherrellbc,“忽略任何空白,直到格式”是不正确的。scanf()的精确功能很长。请注意:"%c""%n""%[]" 不会跳过前导空格。 - chux - Reinstate Monica
@chux,啊,我的错误。我读取时假设它会跳过空格,但你必须首先包括空格字符(就像Haacks上面所做的那样)才能触发此功能。 - sherrellbc
2
应该注意(不是你提出这个建议)fflush 应该只用于输出流(例如不要用于 stdin)。 - Fiddling Bits
@FiddlingBits; 已添加。 - haccks

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接