Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1782183
  • 博文数量: 413
  • 博客积分: 8399
  • 博客等级: 中将
  • 技术积分: 4325
  • 用 户 组: 普通用户
  • 注册时间: 2011-06-09 10:44
文章分类

全部博文(413)

文章存档

2015年(1)

2014年(18)

2013年(39)

2012年(163)

2011年(192)

分类: C/C++

2011-11-17 18:38:44

在CU的C/C++版上看到一个关于fgets()与scanf()相关的问题:
  1. #include <stdio.h>
  2. #include <stdlib.h>

  3. int main()
  4. {

  5.         char a[100];
  6.         int b;
  7.         while(1)
  8.         {
  9.                 printf("Please Enter the messgage:");
  10.         // getchar();
  11.                 fgets(a,100,stdin);
  12.                 printf("Please enter a integer:");
  13.                 scanf("%d",&b);
  14.                 printf("%s",a);
  15.                 printf("%d\n",b);
  16.         }
  17.         return 0;
  18. }
  19. ~
  1. 执行上面这段代码,在第一次循环是会是正常的
  2. “Please Enter the message” 和 “Please enter a integer:” 各占一行,等待输入。
  3. 但是在第二次循环的时候 这两句话就出现在了同一行, fgets(a,100,stdin)这句话失效了?这是为什么呢?fgets不会等待输入吗?那为什么第一次循环可以得到想要的结果?结果如下图:
  4. 另外,如果把 getchar(); 的注释去掉,可以解决上述问题,fgets每次都等待输入,但是在第一次循环的时候,第一个字符会被“吃掉”,但是第二次循环就不会被吃掉,这又是为什么???结果如下图
  5. 请高手指点
下面是我利用gdb进行Debug之后的回复:
  1. 在你第一次循环时,在提示“Please enter a integer:”之后,你输入了123,注意后面还有一个“回车”,而这个“回车”会一直到你第二次循环的fgets()函数所读取到。所以效果上,第二次循环的fgets()函数好像没有执行一样,实际上它执行了,但是读取的是你第一次循环时,最后输入的“回车”。
  2. 你可以将fgets()函数换成scanf。就没有这个问题。
  3. 其实通过gdb可以很容易的找到问题。
  4. 这个例子显示了scanf和fgets两个函数的区别。
其实这个例子显示了scanf和fgets两个函数的区别:
(1) scanf("%d",&b)是根据参数"%d"来从输入流中读取字符的,面对整数后面的“回车”,它并不会读取,因为它不符合条件"%d"。所以那个“回车”就一直留在了输入缓冲中,直到第二次循环时 fgets(a,100,stdin)读取到了a中。所以就给人以第二次fgets函数没有执行的假象。
(2)而fgets(a,100,stdin); 函数会从输入流中读取字符直到:遇到“回车”符,或者达到了100个字符为止。

这个例子似乎说明了C在处理输入输出流方面没有C++那么简洁。

如果将fgets换成scanf也有一点小问题:
scanf("%s", a); 它不会读取我们输入的前缀的空格和后缀的空格,这样就会导致如果输入“the message"时,scanf只能读取到"the",网友pmerofc的解决方法是:
  1. while(1)
  2.         {
  3.                 printf("Please Enter the messgage:");
  4.                 fgets(a100stdin);
  5.                 printf("Please enter a integer:");

  6.                 scanf("%d"&b);
  7.                 while(getchar(!'\n')
  8.                    ;

  9.                 printf("%s"a);
  10.                 printf("%d\n"b);
  11.         }



阅读(3571) | 评论(2) | 转发(2) |
给主人留下些什么吧!~~

digdeep1262011-11-21 16:52:31

scanf("%d", &b);
这行代码要你输入一个整数,然后按一下回车,这句话的意思是将回车,以及回车以前的非数字的字符丢掉(比如你可能输入 123 aaa回车,其中123被scanf读取到了,剩下的“ aaa回车”我们需要将它从输入缓存中读取出来,然后丢掉,以免被第二次循环时的fgets()函数所读取到了。)。

suanmeilizhi2011-11-21 13:34:30

while(getchar() != '\n')
                   ;
这句话的作用是什么?