C 当用户键入错误的输入时,是否有方法要求用户输入新的输入?

C 当用户键入错误的输入时,是否有方法要求用户输入新的输入?,c,C,我试图在用户每次键入错误的输入时要求用户输入新的输入: int year; char temp; do{ printf("Please enter the year: "); }while(scanf("%d%c",&year,&temp)!=2 || temp != '\n'); 我尝试过这样做,但当我输入错误的输入(非整数)时,控制台窗口开始疯狂旋转,并且没有停止。当您需要用户输入时,强制用户提供您需要的信息。构建您的读取,以优雅地处理用户尝试输入的任何内容(即使是

我试图在用户每次键入错误的输入时要求用户输入新的输入:

int year;
char temp;
do{
    printf("Please enter the year: ");
}while(scanf("%d%c",&year,&temp)!=2 || temp != '\n');

我尝试过这样做,但当我输入错误的输入(非整数)时,控制台窗口开始疯狂旋转,并且没有停止。

当您需要用户输入时,强制用户提供您需要的信息。构建您的读取,以优雅地处理用户尝试输入的任何内容(即使是猫踩键盘)。您还需要处理手动生成的
EOF
,用户可以通过按Ctrl+d(或windows上的Ctrl+z)来取消输入

最好使用面向行的输入函数每次读取一行,例如
fgets()
或POSIX
getline()
(注意:所有面向行的函数读取并在它们填充的缓冲区中包含尾随的
'\n'
,以确保使用完整的输入行)。然后,您可以从读取的行中解析所需的任何值。避免使用格式化输入函数line
scanf/fscanf
,这对新程序员来说充满了陷阱,因为输入流中剩余的内容取决于所使用的格式说明符以及是否出现匹配或输入失败

方法很简单。循环不断地提示输入检查输入函数的返回值。处理
EOF
案例,然后验证您的转换(如果有),最后检查任何值输入是否符合您为输入设置的标准

阅读<代码>年份的一个简单示例是:

#include <stdio.h>

#define MAXC 1024   /* if you need a constant, #define one (or more) */

int main (void) {

    char buf[MAXC];     /* buffer to hold line (don't skimp on size) */
    int year;           /* integer to hold year */

    for (;;) {  /* loop continually to force user to provide needed input */
        fputs ("\nenter year (0-2050): ", stdout);  /* prompt */
        fflush (stdout);                            /* force display */
        if (!fgets (buf, MAXC, stdin)) {    /* read entire line of input */
            fputs ("(user canceled input)\n", stdout);
            return 0;
        }
        if (sscanf (buf, "%d", &year) != 1) {   /* validate conversion */
            fputs ("error: invalid integer input.\n", stderr);
        }
        else if (year < 0 || year > 2050) {     /* validate in range */
            fputs ("error: year entered is out of range '0-2050'.\n", stderr);
        }
        else
            break;  /* valid input received */
    }

    printf ("\nyear: %d\n", year);
}

当你感到满意时,你每次都会从用户那里得到你所需要的,你有一个很好的程序。仔细检查一下,如果您还有其他问题,请告诉我。

“while”的意思是“在同一时间”。使用scanf,用户键入时,您无法执行任何操作。你必须等到他完成打字。可能是重复的。@Holger我想知道是否有些混淆是因为C关键字
显然不是“同时”的意思——实际上我很困惑,因为我认为你的句子指的是关键字!;-)。C的关键字
while
最好命名为“and\u do\u reach\u if”左右。(对于汤姆森和里奇的辩护,应该说,在20世纪70年代,并发性不是一个问题。)我在问题的标题中提到了while。“边打边问”的意思是同时问。这并不奇怪,谷歌搜索在打字时做了很多事情。关键字的意思是“只要”,这也是while的正确用法,因为“条件为真”和“执行操作”同时发生(在人类语言意义上,而不是在IT意义上)。如果出于某种原因,您仍然想使用
scanf
,则可以使用,但必须正确使用。参见,例如,此答案
$ ./bin/readintyear

enter year (0-2050): What do I get if I do?
error: invalid integer input.

enter year (0-2050): Banannas!
error: invalid integer input.

enter year (0-2050): 2055
error: year entered is out of range '0-2050'.

enter year (0-2050): 2019

year: 2019