【问题标题】:Scanf for integer not working as expected when I input float or string当我输入浮点数或字符串时,整数的 Scanf 无法按预期工作
【发布时间】:2020-04-10 09:17:06
【问题描述】:

我是 C 语言的新手,我写这段代码是为了好玩。在这里,我先取用户名,然后从用户那里取一个猜测数字。我写了一个函数来检查 number 是否是 int (只需要整数输入。)

#include <stdio.h>
#include <stdlib.h>
#include <math.h>

int main()
{
    char userName[30];
    int userGuess, check;
    int checkGuess(int, int);

    printf("Enter your name - ");
    scanf("%s",&userName);
    int i = 0;
    while(++i<=10)
    {
        printf("Enter Your Guess: ");
        check = scanf("%d",&userGuess);
        checkGuess(userGuess, check);
    }
    return 0;
}

int checkGuess(int userGuess, int check)
{
    if(check == 1)
    {
        printf("yes int, %d.\n",userGuess);
    } else
    {
        printf("Not int\n");
    }

}

但是,当我放入整数时,它工作正常,但当我放入字符串或浮点数时,它只会运行循环直到结束。

【问题讨论】:

  • 因为任何无法被scanf 转换的输入都保留在输入缓冲区中。请使用fgetssscanf
  • 或者清除输入缓冲区。
  • 一般scanf不是为交互式用户输入而设计的。使用fgets,后跟ssccanf
  • 请注意,scanf("%d",&amp;userGuess); 将返回 1 输入 1.1(并且忽略 .1)但会失败(返回 0)输入 .1 .
  • 有没有办法用scanf做到这一点?

标签: c scanf


【解决方案1】:

scanf 失败时,您需要刷新stdin

while (i < 10)
{
    printf("Enter Your Guess: ");
    check = scanf("%d", &userGuess);
    if (check != 1)
    {
        // Flush stdin
        while ((check = fgetc(stdin)) != '\n' && check != EOF);
    }
    else
    {
        // Increment i only when scanf has success
        i++;
    }
}

看看Why to use fgets() over scanf() in C?

【讨论】:

  • 问题是我只需要从用户那里收集 10 个 **integer ** 输出。有什么办法吗?
  • 有没有办法只得到10个整数输入,只使用scanf而不刷新标准输入?
  • 我不能使用flush
  • 为什么不呢?这样的要求是荒谬的
  • 根据提出这个问题的人的说法,它可以在没有 scanf 的情况下完成。我不知道怎么做。如果我能向您展示整个问题,那就更好了。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-05-17
  • 2021-06-07
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多