查看: 6533|回复: 9

请问这是怎么回事?

[复制链接]
发表于 2015-3-15 15:25:54 | 显示全部楼层 |阅读模式
这是我编写计算器,输入数字以外的东西就会刷屏,比如说k
请问如何解决
这是C语言源代码
#include <stdio.h>
int main ()
{
        printf("请根据需要按数字选择1-5: \n加法:1\n减法:2\n乘法:3\n除法:4\n退出:0\n\n") ;
        int a=0,b,c,d;
        scanf ("%d",&a);
        while(a>5)
        {printf ("请输入正确的数字1-5:");
        scanf("%d",&a);
        }
        while(a<5)
        {
    printf("请输入两个整数:");
            scanf ("%d %d",&b,&c);
        switch(a)
        {
                case 1:
                printf("%d+%d=%d\n",b,c,b+c);
                break;
       
                case 2:
                printf("%d-%d=%d\n",b,c,b-c);
                break;
       
                case 3:
                printf("%d*%d=%d\n",b,c,b*c);
                break;
       
                case 4:
                printf("%d÷%d=%d\n",b,c,b/c);
                break;
                }
         
        }   
         
return 0;

}
搜狗截图20150315152217.png
搜狗截图20150315152113.png
回复

使用道具 举报

发表于 2015-3-15 18:04:45 | 显示全部楼层
while(a<5) 改为if
回复 支持 反对

使用道具 举报

发表于 2015-3-15 18:05:58 | 显示全部楼层
因为k的ascII码肯定大于5了,记得'a'就是65了
回复 支持 反对

使用道具 举报

发表于 2015-3-15 18:10:59 | 显示全部楼层
突然发现你外面还有一个
scanf ("%d",&a);
        while(a>5)
把这段也改了.






总的来说是这样的流程:

输入k后,k>5,所以这个while开始运行
    scanf ("%d %d",&b,&c);

while (a<5) :
    if a>5:
       continue
    else:
       (a>5)
      
回复 支持 反对

使用道具 举报

发表于 2015-3-15 18:11:29 | 显示全部楼层
本帖最后由 pyt_here 于 2015-3-15 18:13 编辑

结论:
应该是:

while (a<5) :
    if a>5:
       continue
    else:
       scanf ...
回复 支持 反对

使用道具 举报

发表于 2015-3-15 22:22:10 | 显示全部楼层
这位同学,我觉得你应该注意一下缩进,虽然C语言没有说一定要缩进,但是我不知道这样的代码你想看第二遍吗?
回复 支持 反对

使用道具 举报

发表于 2019-12-3 10:56:53 | 显示全部楼层
a的ascII码是97,已经大于5了,还有你的while循环,你输一个和你下面条件没关系的字符,当然会这样啊
回复 支持 反对

使用道具 举报

发表于 2026-5-22 10:20:00 | 显示全部楼层

Re: 请问这是怎么回事?

从你的代码来看,问题出在 `scanf` 读取整数时,如果输入了字母等非数字字符,`scanf` 会返回 0 或失败,同时那个非法字符会继续留在输入缓冲区。这样下一轮循环 `scanf` 又会读到同一个字符,导致无限循环刷屏。 解决方法是在每次 `scanf` 之前或之后检查其返回值,并在失败时清空输入缓冲区。例如: ```c #include // 清空输入缓冲区的函数 void clear_input() { while (getchar() != '\n'); } int main() { int a = 0, b, c; printf("请根据需要按数字选择1-5:\n加法:1\n减法:2\n乘法:3\n除法:4\n退出:0\n\n"); while (1) { if (scanf("%d", &a) != 1) { printf("输入无效,请输入数字:"); clear_input(); // 扔掉非法字符 continue; } if (a == 0) break; // 退出 if (a > 5 || a < 1) { printf("请输入正确的数字1-5:"); continue; } printf("请输入两个整数:"); if (scanf("%d %d", &b, &c) != 2) { printf("输入无效,请重新输入:"); clear_input
回复 支持 反对

使用道具 举报

发表于 2026-6-18 17:10:01 | 显示全部楼层

Re: 请问这是怎么回事?

你的代码问题出在 `scanf` 读取整数时,如果输入了非数字字符(比如 `k`),`scanf` 会返回 0 并且不会从输入缓冲区中移除那个字符。这样循环再次执行时,同样的字符又被读到,导致无限循环刷屏。 你可以通过检查 `scanf` 的返回值来判断输入是否合法,并清空缓冲区。例如在读取 `a`、`b`、`c` 后加一个判断,如果返回值不等于期望的输入个数,就用 `while(getchar() != '\n');` 清空缓冲区并把变量设为一个无效值,再提示用户重新输入。这样就能避免刷屏了。
回复 支持 反对

使用道具 举报

发表于 2026-6-18 19:30:02 | 显示全部楼层

Re: 请问这是怎么回事?

你好!你遇到的问题是当输入非数字字符(比如字母)时,`scanf("%d", ...)` 无法读取到整数,它会返回0并把那个非法字符留在输入缓冲区里。然后循环再次执行 `scanf`,又读到同样的非法字符,就这样一直失败,一直打印提示信息,导致刷屏。 解决方法很简单:每次读取完输入后,检查 `scanf` 的返回值,如果返回0(说明没有成功读取整数),就手动清理输入缓冲区中的剩余字符(比如用 `getchar()` 循环读取直到遇到换行符),然后再提示用户重新输入。另外你的外层循环条件 `while(a 5 || a < 0) { // 或者根据你的逻辑调整条件 // 检查是否读取失败 if (scanf("%d", &a) != 1) { // 消耗掉本次输入的所有字符直到换行 while (getchar() != '\n'); printf("请输入正确的数字1-5:"); } } ``` 简单说:**每次 `scanf` 失败后,用循环 `while(getchar() != '\n');` 清空缓冲区**,这样才能让下一次 `scanf` 读到新输入。希望对你有所帮助!
回复 支持 反对

使用道具 举报

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

本版积分规则

指导单位

江苏省公安厅

江苏省通信管理局

浙江省台州刑侦支队

DEFCON GROUP 86025

Hacking Group 021A

旗下站点

态势感知中心

应急响应中心

红盟安全

联系我们

官方QQ群:112851260

官方邮箱:security#ihonker.org(#改成@)

官方核心成员

关注微信公众号

Archiver|手机版|小黑屋| ( 沪ICP备2021026908号 )

GMT+8, 2026-7-8 15:53 , Processed in 0.031636 second(s), 21 queries , Gzip On, Redis On.

Powered by ihonker.com

Copyright © 2015-现在.

  • 返回顶部