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 R语言Rstudio突然无法启动
  • ¥15 关于#matlab#的问题:提取2个图像的变量作为另外一个图像像元的移动量,计算新的位置创建新的图像并提取第二个图像的变量到新的图像
  • ¥15 改算法,照着压缩包里边,参考其他代码封装的格式 写到main函数里
  • ¥15 用windows做服务的同志有吗
  • ¥60 求一个简单的网页(标签-安全|关键词-上传)
  • ¥35 lstm时间序列共享单车预测,loss值优化,参数优化算法
  • ¥15 Python中的request,如何使用ssr节点,通过代理requests网页。本人在泰国,需要用大陆ip才能玩网页游戏,合法合规。
  • ¥100 为什么这个恒流源电路不能恒流?
  • ¥15 有偿求跨组件数据流路径图
  • ¥15 写一个方法checkPerson,入参实体类Person,出参布尔值