鱼C论坛

 找回密码
 立即注册
查看: 4687|回复: 3

在scanf("%d",&m)函数中输入字符的后果

[复制链接]
发表于 2013-10-8 01:11:38 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
下面是我写的判断输入的数是否为素数的一个小程序,如果正常输入整型数据没有问题,
但如果误输入字符后就有问题了,输入的数据没法传到m变量中,并且在下一个循环不会
等待数据的输入,就直接往下执行了,谁能帮分析一下原因吗?


  1. #include <stdio.h>
  2. #include <math.h>

  3. void main()
  4. {
  5.       int m, i, k;
  6.       char ch = '\0';
  7.       while(1)
  8.       {
  9.             printf("Input a number: ");
  10.             scanf("%d", &m);  //等待数据输入
  11.             k = sqrt(m);
复制代码


小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2013-10-8 01:15:02 | 显示全部楼层
  1. for( i = 2; i <= k; i++ )
  2.             {
  3.                   if( 0 == m % i)
  4.                   {
  5.                         break;
  6.                   }
  7.             }
  8.             if( i > k )
  9.             {
  10.                   printf("您输入的是一个素数\n");
  11.             }
  12.             else
  13.             {
  14.                   printf("您输入的不是一个素数\n");
  15.             }
  16.             printf("Exit: Esc\tContinue: Enter\n");   //继续按Enter,退出按Esc
  17.             
  18.             for( ch = getch() ;27 != ch && 13 != ch; ch = getch() )     //判断按下的是Esc还是Enter,
  19.             {                                                          //都不是,继续等待按键按下,直到是为止
  20.                   continue;
  21.             }
  22.             if( 27 == ch )
  23.             {
  24.                   break;      //按下Esc退出
  25.             }
  26.             
  27.       }
  28. }
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2013-10-8 01:24:27 | 显示全部楼层
scanf如果没有接收到所需要的数据类型的数据时,并不会清空缓存,以上代码在运行后,如果输入一个字符串时,由于scanf需要一个整型数据,可是当前输入缓冲中的数据并不是一个整型的数据,那么scanf会直接退出,并返回0,表示读到0个数,同时不会改为输入缓冲,这样在打印出"error,input again:"后,会进入到下一轮的循环之中,这时由于输入缓冲中还有数据,scanf不会阻塞,而是直接返回,可是发现缓冲中的数据不是所要的数据,这样返回0.....使得循环一直运行下去,而不可能因为用户的再次输入退出循环。

可把代码做如下改变
  1. while((k = scanf("%d",&m))!=1)
  2.     {
  3.         printf("error,input again:");
  4.         while((ch=getchar())!='\n');
  5.         k = sqrt(m);
  6.     }
复制代码
这样当用户输入的数据类型非法时,内层的while循环就会不停的读输入缓冲,直到读完或收到一个回车换行为止,这样就达到清空输入缓冲的目的了,这种方法具有跨平台的特性。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2013-10-8 10:45:19 | 显示全部楼层

非常感谢,大致了解了,那用什么方法可以查看当前缓冲区的数据呢
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-5-30 14:38

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表