鱼C论坛

 找回密码
 立即注册
查看: 5701|回复: 8

scanf("%d",&s);键盘输入的是字符会怎么处理

[复制链接]
发表于 2012-10-27 20:03:31 | 显示全部楼层 |阅读模式

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

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

x
do
        {
                printf("                        请选择调度算法或退出\n");
                printf("                        1:FCFS        2:SJF  0:退出        :");
                scanf("%d",&s);
                if(s==1)
                {
                        FCFS();
                }
                else if(s==2)
                {
                        SJF();
                }
                else if(s==0)
                        break;
                else
                {
                        printf("错误输入,请重新输入:\n");
                }

        }while(1);       


如上,键盘输入字符的话就进入printf("错误输入,请重新输入:\n");的死循环了,求解!!!

补充内容 (2012-10-27 20:08):
s是整形;
断点显示死循环时经过scanf,但就没让我输入~~~~~~~~~
小甲鱼最新课程 -> https://ilovefishc.com
发表于 2012-11-1 06:53:59 | 显示全部楼层
加个Break或者把输入清o就行了  你那程序设置的都是死循环
小甲鱼最新课程 -> https://ilovefishc.com
发表于 2012-11-1 19:50:35 | 显示全部楼层
不知道 求解释
小甲鱼最新课程 -> https://ilovefishc.com
 楼主| 发表于 2012-11-1 21:25:27 | 显示全部楼层
小甲鱼最新课程 -> https://ilovefishc.com
发表于 2012-11-1 21:43:29 | 显示全部楼层
  1. do
  2.         {
  3.                 printf("                        请选择调度算法或退出\n");
  4.                 printf("                        1:FCFS        2:SJF  0:退出        :");
  5.                 scanf("%d",&s);
  6.                 fflush(stdin); // 清空输入缓存区
  7.                 if(s==1)
  8.                 {
  9.                         FCFS();
  10.                 }
  11.                 else if(s==2)
  12.                 {
  13.                         SJF();
  14.                 }
  15.                 else if(s==0)
  16.                         break;
  17.                 else
  18.                 {
  19.                         printf("错误输入,请重新输入:\n");
  20.                 }

  21.         }while(1);        
复制代码
具体你在输入字符以后,编译器在处理scanf函数时,输入流中存入了字符型数据,由于要输入整数,scanf函数会执行失败,会返回一个值为0;进入一个死循环,你可以尝试用这个函数试试,清楚输入缓存区fflush(stdin); 我也是个初学者,回答不一样完美准确,个人建议仅供参考!
小甲鱼最新课程 -> https://ilovefishc.com
发表于 2012-11-1 22:00:03 | 显示全部楼层
这个是scanf函数的问题,在你第一次给s输入值之后,第二次scanf不会被调用,可能是scanf函数的缺陷吧,所以建议给改成getchar函数,修改后代码
do
        {
                printf("                        请选择调度算法或退出\n");
                printf("                        1:FCFS        2:SJF  0:退出        :");
                s=getchar();//这里scanf函数改为getchar函数
                if(s==1)
                {
                        FCFS();
                }
                else if(s==2)
                {
                        SJF();
                }
                else if(s==0)
                        break;
                else
                {
                        printf("错误输入,请重新输入:\n");
                        s=getchar();//这里为什么加个我也不太清楚,还是得从输入函数找问题,希望大家多指教啊,我也在迷茫,求高手帮助
                }

        }while(1);  
小甲鱼最新课程 -> https://ilovefishc.com
 楼主| 发表于 2012-11-2 00:27:08 | 显示全部楼层
落夜 发表于 2012-11-1 22:00
这个是scanf函数的问题,在你第一次给s输入值之后,第二次scanf不会被调用,可能是scanf函数的缺陷吧,所以 ...

哈哈,多谢啦!用 s=getchar();的话s就要改字符型了(也好),不然输入1或2 也会是输入错误了
至于你那第二个s=getchar();应该是回车键也占了一个字符,所以多用一个 s=getchar();把它用掉吧!
小甲鱼最新课程 -> https://ilovefishc.com
 楼主| 发表于 2012-11-2 00:29:37 | 显示全部楼层
akon 发表于 2012-11-1 21:43
具体你在输入字符以后,编译器在处理scanf函数时,输入流中存入了字符型数据,由于要输入整数,scanf函数会 ...

厉害,:handshake长见识了!
小甲鱼最新课程 -> https://ilovefishc.com
发表于 2012-11-2 07:11:22 | 显示全部楼层
《老实人》 发表于 2012-11-2 00:27
哈哈,多谢啦!用 s=getchar();的话s就要改字符型了(也好),不然输入1或2 也会是输入错误了
至于你那第 ...

其实这个问题小甲鱼c视频里提到过,不过没作为重点,建议就少用printf多用getchar
小甲鱼最新课程 -> https://ilovefishc.com
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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

GMT+8, 2025-11-16 00:35

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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