鱼C论坛

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

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

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

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

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

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

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

void main()
{
      int m, i, k;
      char ch = '\0';
      while(1)
      {
            printf("Input a number: ");
            scanf("%d", &m);  //等待数据输入
            k = sqrt(m);

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2013-10-8 01:15:02 | 显示全部楼层
for( i = 2; i <= k; i++ )
            {
                  if( 0 == m % i)
                  {
                        break;
                  }
            }
            if( i > k )
            {
                  printf("您输入的是一个素数\n");
            }
            else
            {
                  printf("您输入的不是一个素数\n");
            }
            printf("Exit: Esc\tContinue: Enter\n");   //继续按Enter,退出按Esc
            
            for( ch = getch() ;27 != ch && 13 != ch; ch = getch() )     //判断按下的是Esc还是Enter,
            {                                                          //都不是,继续等待按键按下,直到是为止
                  continue;
            }
            if( 27 == ch )
            {
                  break;      //按下Esc退出
            }
            
      }
}
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

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

使用道具 举报

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

非常感谢,大致了解了,那用什么方法可以查看当前缓冲区的数据呢
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-11-21 23:42

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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