C语言中的无限循环码

C语言中的无限循环码,c,infinite-loop,C,Infinite Loop,在下面的程序中,我尝试输入一个介于1到100之间的数字,但如果在scanf()语句的执行期间输入a

在下面的程序中,我尝试输入一个介于
1
100
之间的数字,但如果在
scanf()
语句的执行期间输入
a
“string”
(如s或
sova
),则会创建一个无限循环。所以我试着做。。。。当我输入一个字符串或字符时,它会向我显示一条消息,如“输入的值错误。请再次输入”,然后它会再次输入…
Thanx

#包括
int main()
{
INTA;
scanf(“%d”和“&a”);
而(!(a>=1&&a
  • 您需要检查
    scanf的返回值
  • 如果用户未输入整数,则需要接受输入。
    scanf
    函数将持续显示非整数,请重试。因此,如果
    scanf
    返回0,则需要处理它

  • 当您使用scanf时,您使用的是缓冲输入,这意味着当您输入一个值时,请说“123”,然后按enter键,“123”加上结束字符(enter)将全部添加到缓冲区。
    scanf
    然后删除123,因为
    %d
    指定应读取一个整数,但如果用户输入无效内容,如字符串,则缓冲区将不会清空

    从键盘读取输入的更好方法是使用fgets(),其中指定了要读取的最大长度。一旦有了输入,就可以使用sscanf()从中检索数值。输入之前不会刺激您的输入

    char buffer[128];
    fgets( buffer, 128, stdin );
    sscanf( buffer, "%d", &a );
    
    此外,请始终检查函数的返回值作为经验法则,以便在函数失败时可以执行适当的操作。

    试试这个

    #include <stdio.h>
    #define FLUSH while (getchar() != '\n')  // macro to eat invalid input
    
    int main (void) {
    
        int a = 0;
        printf ("Enter an integer: ");
        scanf("%d", &a);
    
        while (a < 1 || a > 100) {
    
            FLUSH;
            printf("Invalid input. Please try again: ");
            scanf("%d",&a);
        }
    
        printf("You entered %d.\nThanks!\n", a);
        return 0;
    }
    
    #包括
    #定义FLUSH while(getchar()!='\n')//宏以读取无效输入
    内部主(空){
    int a=0;
    printf(“输入一个整数:”);
    scanf(“%d”和“&a”);
    而(a<1 | | a>100){
    脸红
    printf(“无效输入。请重试:”;
    scanf(“%d”和“&a”);
    }
    printf(“您输入了%d。\n银行!\n”,a);
    返回0;
    }
    
    您的代码显示了几个需要更改的编码习惯:

  • main()
    的参数列表中包括
    (void)
  • 在二进制运算符的两边留空格:
    而(!(a>=1&&a=1&&a 100)
    ,后者更容易阅读
  • 在需要时提示用户输入。不要让光标停留在空行上,没有指示用户要做什么
  • 在提示中使用正确的语法和大小写。没有理由在编程中偷懒

  • 如果scanf的返回值不等于您希望用户输入的项目数,请读取输入缓冲区的所有字符,直到出现“\n”。但是,您可以使用如下函数包装循环,而不是将整个循环反复复制到代码中用户应输入的位置:

    #include <stdio.h>
    #include <stdarg.h>
    #include <string.h>
    
    void input(const char *format,...)
    {
        va_list ap;
        int r;
        /* number of items [to read] */
        int noi=0;
    
        for(r=0;r<strlen(format)-1;r++)
        {
            if(format[r]=='%')
            {
                if(format[r+1]!='%')
                    noi++;
                else
                    r++;
            }
        }
    
        do
        {
            va_start(ap,format);
            r=vscanf(format,ap);
            va_end(ap);
    
            if(r!=noi)
            {
                switch(r)
                {
                    case EOF:
                    case 0:
                        printf("All wrong, try again!\n");
                    break;
    
                    default:
                        printf("Unexpected value after item no %d!\n",r);
                }
    
                 while(getc(stdin)!='\n');
            }
            else
                break;
    
        } while(1);
    }
    
    #包括
    #包括
    #包括
    无效输入(常量字符*格式,…)
    {
    va_列表ap;
    INTR;
    /*项目数[待阅读]*/
    int noi=0;
    
    对于(r=0;rWhy not
    do…while
    ?首先,无法获得使用while循环的原因。您可以简单地使用if和else as。@iPhoneDev用户可能会不断给出错误的值我不得不说,这两个注释都无法回答问题或提供问题的见解。^^^^^如果您不输入
    int
    值,则scanf不会消耗输入,而该输入仍然是stdin buffer您需要通过读取未扫描的字符来刷新该缓冲区--Read:我详细解释了相同的问题,但是
    %d
    转换规范确实跳过了前导空格;在这种情况下,换行符仍然在缓冲区中并不重要。
    #include <stdio.h>
    #include <stdarg.h>
    #include <string.h>
    
    void input(const char *format,...)
    {
        va_list ap;
        int r;
        /* number of items [to read] */
        int noi=0;
    
        for(r=0;r<strlen(format)-1;r++)
        {
            if(format[r]=='%')
            {
                if(format[r+1]!='%')
                    noi++;
                else
                    r++;
            }
        }
    
        do
        {
            va_start(ap,format);
            r=vscanf(format,ap);
            va_end(ap);
    
            if(r!=noi)
            {
                switch(r)
                {
                    case EOF:
                    case 0:
                        printf("All wrong, try again!\n");
                    break;
    
                    default:
                        printf("Unexpected value after item no %d!\n",r);
                }
    
                 while(getc(stdin)!='\n');
            }
            else
                break;
    
        } while(1);
    }