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日

悬赏问题

  • ¥30 YOLO检测微调结果p为1
  • ¥20 求快手直播间榜单匿名采集ID用户名简单能学会的
  • ¥15 DS18B20内部ADC模数转换器
  • ¥15 做个有关计算的小程序
  • ¥15 MPI读取tif文件无法正常给各进程分配路径
  • ¥15 如何用MATLAB实现以下三个公式(有相互嵌套)
  • ¥30 关于#算法#的问题:运用EViews第九版本进行一系列计量经济学的时间数列数据回归分析预测问题 求各位帮我解答一下
  • ¥15 setInterval 页面闪烁,怎么解决
  • ¥15 如何让企业微信机器人实现消息汇总整合
  • ¥50 关于#ui#的问题:做yolov8的ui界面出现的问题