scanf()与标准输入

作者在 2007-09-02 05:12:00 发布以下内容

现在,给大家说一说使用scanf()函数的一些值得注意的地方.不知大家有没有在编程的时侯,使用了scanf()函数后会出现一些异常情况.
大家有没有注意到要结束scanf()函数的输入一定要按回车键.是的,原因就是出现在这个地方.它的作用就是从输入流提取数据.
输入流的指针在stdio.h文件中有宏定义#define stdin   (&_streams[0]) .也就是scanf()函数相当于:fscanf(stdin,...).
例如scanf("%d",&i); 相当于fscanf(stdin,"%d",&i); .所以,当输入流中有数据时,scanf()就从中提取数据,
不管你输入到输入流数据是什么.
比如下面例子:
#include<stdio.h>
#include<conio.h>
int main(void)
{
  char string[10];
  int i;
  clrscr();
  for(i=0;i<10;i++)
    scanf("%c",&string);

  printf("\n\n");

  for(i=0;i<10;i++)
    printf("%d\n",string);

  getch();
  return 0;
}
在运行时,输入到第5字符就输入结束.
结果:
1
2
3
4
5


49
10
50
10
51
10
52
10
53
10

从结果中,大家可以看出scanf()函数从输入流中提取'\n'字符.
也就是说,每当你输入完一个字符按一下回车符,这个输入的字符被scanf()提取了.但回车符还在输入流中,
当下一次scanf()函数时,因为输入流中有数据,就不从屏幕中等待输入了,就直接提取数据.这是scanf()函数提取的是:'\n'.
也就是出现了运行中,本来要输入10次字符,结果只输入了5次.
那么有什么解救的方法呢.我能想到的方法有二种:一种是每当scanf()函数执行后,把输入流中的'\n'提取出来以便下次scanf()
能正常提取.第二种方法是每当scanf()函数执行后,把输入流的数据清空(建议不要使用这种方法).
现在以第一种方法解决:
for(i=0;i<10;i++)                      for(i=0;i<10;i++)                           for(i=0;i<10;i++)
  scanf("%c",&string);  改为====>>> {  scanf("%c",&string);             或   {  scanf("%c",&string);
                                          getchar(); /*用来提取输入流的'\n'*/         scanf("%c",NULL);  /*用来提取输入流的'\n'*/
                                       }                                           }
现在以第二种方法解决:
for(i=0;i<10;i++)           for(i=0;i<10;i++)
 scanf("%c",&string); 改为====>>> {  scanf("%c",&string);
                                          fflush(stdin); /*用来清空输入流*/
                                       }
好了scanf()就说到这里吧.

应"静源"在本文章的提醒,就在此作一定的补充说明.
出现,scanf()接受回车留下的换行符的情况,只有在scanf("%c",&ch);情况下.
如果用scanf()来输入其它类型的数据,就不会发现上述情况.
在此,多谢"静源"的提醒.

我的C语言编程经验 | 阅读 2294 次
文章评论,共0条
游客请输入验证码