qianmubanpingcu 2023-01-27 12:09 采纳率: 83.3%
浏览 38
已结题

有关于scanf防止错误输入的值。

一个我不太能理解的地方:我的程序以下:


#include "stdio.h"
#include "stdlib.h"

enum color {red,yellow,green,};
void f(enum color c){
    printf("%d\n", c);
}

int main(){
    enum color t = red;
    int i;
    
    /* recont: */
    while( !(scanf("%d", &t)) || (t < 0 || t>2 ) ){
        printf("输入错误,必须输入数字0 <= x <= 2\n\n");
        if ( !(scanf("%d", &t))){
            scanf("%*s");
        }
    }
    f(t);
    /*     //是否继续
    printf("输入1继续:");
    scanf("%d", &i);
    if (i == 1){
        goto recont;
    } */

    system("pause");
    return 0;
}

为了防止输入超出预期的数字,我用

  while( !(scanf("%d", &t)) || (t < 0 || t>2 ) )

来做这件事情,
理论上来说无论输入什么,只要输入的不是0~2之间的某个整数,都会输出“输入错误,必须输入数字0 <= x <= 2\n\n”
但是,很奇怪

1111//输入
输入错误,必须输入数字0 <= x <= 2

7979//输入
32//输入
输入错误,必须输入数字0 <= x <= 2

red//输入


red//输入
输入错误,必须输入数字0 <= x <= 2

1//输入
1
请按任意键继续. . .

这就是问题,只要我上一个输入是数字,我就需要随便输入一个值才能输入下一个值,
只有输入的是一个字符串的时候(“例如‘red‘’”),才能直接开始输入下一个值。
如何解决这一问题呢,我想达到输入错误的值之后打印“输入错误,必须输入数字0 <= x <= 2\n\n”之后立马开始下一次输出而不是输入一个值给不知道什么地方才能开始下一次输出。

  • 写回答

4条回答 默认 最新

  • a5156520 2023-01-27 13:42
    关注

    使用一个while循环把scanf()读取后遗留在缓冲区的其他字符读走即可,修改如下:

    参考链接:

     
    #include "stdio.h"
    #include "stdlib.h"
     
    enum color {red,yellow,green,};
    void f(enum color c){
        printf("%d\n", c);
    }
     
    int main(){
        enum color t = red;
        int i;
        
        /* recont: */
        while( !(scanf("%d", &t)) || (t < 0 || t>2 ) ){
            printf("输入错误,必须输入数字0 <= x <= 2\n\n");
            // https://blog.csdn.net/haoshaokang_/article/details/121593252
            while(getchar()!='\n') // 把scanf()读取后遗留在缓冲区的其他字符读走即可
                continue;
             
        }
        f(t);
        /*     //是否继续
        printf("输入1继续:");
        scanf("%d", &i);
        if (i == 1){
            goto recont;
        } */
     
        system("pause");
        return 0;
    }
    
    

    img

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论 编辑记录
查看更多回答(3条)

报告相同问题?

问题事件

  • 已结题 (查看结题原因) 1月27日
  • 已采纳回答 1月27日
  • 创建了问题 1月27日

悬赏问题

  • ¥15 公司的电脑,win10系统自带远程协助,访问家里个人电脑,提示出现内部错误,各种常规的设置都已经尝试,感觉公司对此功能进行了限制(我们是集团公司)
  • ¥15 救!ENVI5.6深度学习初始化模型报错怎么办?
  • ¥30 eclipse开启服务后,网页无法打开
  • ¥30 雷达辐射源信号参考模型
  • ¥15 html+css+js如何实现这样子的效果?
  • ¥15 STM32单片机自主设计
  • ¥15 如何在node.js中或者java中给wav格式的音频编码成sil格式呢
  • ¥15 不小心不正规的开发公司导致不给我们y码,
  • ¥15 我的代码无法在vc++中运行呀,错误很多
  • ¥50 求一个win系统下运行的可自动抓取arm64架构deb安装包和其依赖包的软件。