c - 当您将 12ab 等输入到 scanf ("%d",&argu) 时会发生什么?

标签 c scanf

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

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

但是当我向其中输入诸如 abcd 之类的内容时,循环将永远持续下去并且不会因提示而停止。

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

然后我看到了这个:

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

然后,当我输入“abcd”之类的内容时,它运行良好,并提示我输入。但是当我输入“12ab”之类的东西时,它就不再起作用了。

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

编辑:

我看到了答案并使用 while(*eptr != '\n') 解决了我的问题。

请注意,fgets 函数实际上将 '\n' 读入数组,而 gets 则不然。所以要小心。

最佳答案

最好使用 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. */
}

关于c - 当您将 12ab 等输入到 scanf ("%d",&argu) 时会发生什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48699714/

相关文章:

c - 在 ld 中明确指定符号的位置

c++ - 是否有可能 #include 失败而不中止编译?

c - 在 shell 内执行和直接执行命令有什么区别?

c - 实现 C#include 指令的内部处理

c - C89 中 scanf 缺失值

C,我打印出随机数(不是地址)而不是扫描的数字

c - 在c中使用互斥锁进行多线程并一次运行一个线程

c - 扫描文本文件时如何跳过一行?

c - 第三次和第四次 scanf 不接受输入

c - 为什么我不能输入值?