C中的无限循环代码

时间:2013-08-30 05:12:16

标签: c infinite-loop

在下面的程序中,我尝试在1100之间输入一个数字,但如果我输入a 'character'"string"(例如s或{ {1}})在sova语句的执行时间内,它创建了一个无限循环。所以我试着做....当我输入一个字符串或一个字符时,它向我显示一条消息,例如“输入了错误的值。再次输入”,它将再次输入...
感谢名单;

scanf()

5 个答案:

答案 0 :(得分:5)

  1. 您需要检查scanf
  2. 的返回值
  3. 如果用户未输入整数,则需要输入输入。 scanf函数将不断表示不是整数,请再试一次。因此,如果scanf返回0,则需要处理它

答案 1 :(得分:4)

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

从键盘读取输入的更好方法是使用fgets()指定要读取的最大长度。输入后,您可以使用sscanf()从中检索数值。 ENTER直到那时不会激怒你的输入。

char buffer[128];
fgets( buffer, 128, stdin );
sscanf( buffer, "%d", &a );

还要始终根据经验检查函数的返回值,以便在函数失败时执行适当的操作。

答案 2 :(得分:0)

试试这个。

#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;
}

您的代码显示了一些需要更改的编码习惯:

  1. (void)的参数列表中加入main()
  2. 在二元运算符的两边留下空格:while(!(a>=1&&a<=100))是不必要的丑陋且难以阅读。
  3. 简化您的逻辑表达式。为什么使用(! (a>=1 && a<=100))时它与(a < 1 || a > 100)的含义相同,而后者更容易阅读?
  4. 需要时提示用户输入。没有光标只是坐在一条空白行,没有指示用户该做什么。
  5. 在提示中使用正确的语法和大小写。你的编程没有理由懒惰。

答案 3 :(得分:0)

如果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);
}

希望有所帮助,

答案 4 :(得分:-1)

为什么你使用循环,你的逻辑似乎必须有一个if --- else条件

while (1)
 {
    if (a>=1&&a<=100)
    {
        printf("wrong value entered. enter again\n");
        scanf("%d",&a);
    }
    else 
    {
         printf("you enter %d. Thanxz",a);
         return 0;
    }
}