【问题标题】:Clearing incorrect scanf inputs in C清除 C 中不正确的 scanf 输入
【发布时间】:2021-12-28 01:07:57
【问题描述】:

我已经搜索了互联网以及我的教科书和讲座以寻找解决此问题的方法,但似乎没有任何效果。

我正在使用 scanf 获取整数输入,并且需要验证正确的输入。

但是,当我将两个字符或两个中间有空格的数字放入 scanf 时,它会运行两次而不是一次,因为 scanf 会挂在未使用的数据上。

我终其一生都无法弄清楚如何清除 scanf 数据,或者让它将所有输入作为一个错误输入一起读取。我知道如何清除 \n,而不是输入中留下的尾随字符。

int scan;
bool validInput = false;
int validScan;
int count = 0;
do 
{
    puts("Enter pin : ");
    validScan = scanf("%d", &scan);
    ((getchar()) != '\n');

    if(validScan !=1)
    {
        count++;
        puts("Incorrect pin entered.");
    }
    else if(scan != PIN)
    {
        count++;
        puts("Incorrect pin entered.");
    }
    else
    {
        validInput = true;
        count = 3;
    }
} while (count < 3);
return validInput;

【问题讨论】:

  • 发布你的代码?
  • 如果您的 scanf() 调用失败,通常明智的做法是读取并包含下一个换行符:int c; while ((c = getchar()) != EOF &amp;&amp; c != '\n') ;(循环后的分号通常单独一行表示一个空的循环体)。您可以创建一个 inline 函数来完成这项工作,或者创建一个真正的函数。使用fgets() 读取行并使用sscanf() 进行解析也是一种非常好的技术——尤其是因为您可以更明智地报告导致问题的输入(它保存在fgets()sscanf() 使用的输入缓冲区中) .
  • 另请参阅Using fflush(stdin)? 并仔细阅读并极其谨慎地使用(最好不要使用)。另见How to read/parse input in C? The FAQ
  • PleaseHelpMe222,如果用户输入的只有"\n"会发生什么?

标签: c input scanf buffer


【解决方案1】:

但是,当我将两个字符或两个中间有空格的数字放入 scanf 时,它会运行两次而不是一次,因为 scanf 会挂在未使用的数据上。

您需要将用户输入的解释与读取用户输入分离。

所以不要同时使用scanf

int num1, num2;
bool success = (scanf("%d %d", &num1, &num2) == 2);

使用fgets 阅读它并使用sscanf 解释它:

char buf[1024];
bool success = false;
if(fgets(buf, 1024, stdin) != NULL)
    success = (sscanf(buf, "%d %d", &num1, &num2) == 2);

另请参阅scanf vs fgetsdisadvantages of scanf

【讨论】:

    【解决方案2】:

    您可以在 scanf 之前使用fflush(stdin); 来清理输入。

    【讨论】:

    • 我建议您阅读 this question 以了解为什么这通常是不好的建议。
    • 您的答案可以通过额外的支持信息得到改进。请edit 添加更多详细信息,例如引用或文档,以便其他人可以确认您的答案是正确的。你可以找到更多关于如何写好答案的信息in the help center
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-07-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多