当您向scanf("%d",&argu)输入12ab之类的内容时会发生什么?

Gni*_*ohz 5 c scanf

当我想检查输入的数字时,我遇到了这个问题.如果我成功输入数字,scanf函数将返回1.所以这就是我写的:

int argu;
while(scanf("%d",&argu)!=1){
    printf("Please input a number!\n");
}
Run Code Online (Sandbox Code Playgroud)

但是当我输入像abcd这样的东西时,循环将会永远存在而不会停止提示.

我在网上查了一下,发现它与缓存有关,我需要清理它,以便scanf可以获得新数据.所以我尝试了fflush,但它没有用.

然后我看到了这个:

int argu,j;
while(scanf("%d",&argu)!=1){
    printf("Please input a number!\n");
    while((j=getchar())!='\n' && j != '\n');
}
Run Code Online (Sandbox Code Playgroud)

然后,当我输入像'abcd'这样的东西时,它运作良好,并提示我输入.但是当我输入像"12ab"这样的东西时,它就不会再起作用了.

那么我有没有办法检查scanf的输入("%d",&argu)实际上是一个数字,如果不是,则提示输入另一个输入?

编辑:

我看到了答案并通过使用解决了我的问题scanf.

请注意,该abcd函数实际上是对数组读取'\n'而scanf不是.所以要小心.

unw*_*ind 4

最好使用 读取整行,fgets()然后检查它,而不是尝试从输入流中“即时”解析。

这样就更容易忽略无效输入。

使用fgets()和 然后strtol()将其转换为数字,这样可以很容易地查看数字后面是否有尾随数据。

例如:

char line[128];

while(fgets(line, sizeof line, stdin) != NULL)
{
   char *eptr = NULL;
   long v = strtol(line, &eptr, 10);
   if(eptr == NULL || !isspace(*eptr))
   {
     printf("Invalid input: %s", line);
     continue;
   }
   /* Put desired processing code here. */
}
Run Code Online (Sandbox Code Playgroud)