2

在下面的程序中,我尝试在 to 之间输入一个数字1100但如果我在语句执行期间输入a 'character'or "string"(如 s 或),它会创建一个无限循环。所以我尝试这样做....当我输入一个字符串或一个字符时,它会向我显示一条消息,例如“输入错误的值。再次输入”,它会再次输入... 谢谢;sovascanf()

#include<stdio.h>
int main()
{
    int a;
    scanf("%d",&a);
    while(!(a>=1&&a<=100))
    {
        printf("wrong value entered. enter again\n");
        scanf("%d",&a);
    }
    printf("you enter %d. Thanxz",a);
    return 0;
}
4

4 回答 4

5
  1. 您需要检查的返回值scanf
  2. 如果用户没有输入整数,则需要吃掉输入。该scanf函数会不断地说不是整数,再试一次。所以如果scanf返回 0 你需要处理它
于 2013-08-30T05:17:52.187 回答
4

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

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

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

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

于 2013-08-30T05:22:01.620 回答
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. 在提示中使用正确的语法和大小写。在你的编程中没有理由偷懒。
于 2013-08-30T05:40:06.043 回答
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);
}

希望有帮助,

于 2013-08-30T06:19:08.833 回答