【问题标题】:While loop never stops when I enter a character in a place [duplicate]当我在一个地方输入一个字符时,循环永远不会停止[重复]
【发布时间】:2018-06-09 21:05:47
【问题描述】:

当我为ˋscanfˋ输入一个字符时,我遇到了这个循环的问题。循环永远不会停止。但是当我输入一个数字时,一切正常。

这是代码:

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

int main() {

    int x;

    printf("Enter 1 Or 2\n");
    scanf("%i",&x);

    while (x!=1 && x!=2) {

        printf("Please Enter A Right Value \n");
        scanf("%i",&x);
    }

    printf("Finish");
}

【问题讨论】:

  • @TusharWalzade 不,他希望它重复,直到您输入有效的输入。
  • do-while 在这里会更好。
  • 你看懂了吗?我已经解释过了并检查了编辑。

标签: c


【解决方案1】:

好吧,当您输入字符时,scanf 实际上会尝试从stdin 获取那些错误的字符输入,但由于它不符合转换规范,只要它失败。然后它将那些错误的输入保留在标准输入中。下一次 scanf 由于这些错误的输入再次失败。因此,您需要在尝试使用scanf 再次获取输入之前清除它。还要检查scanf 的返回值,以防它失败清除stdin

提供的代码检查EOF 以及scanf 的返回值,标准明确说明了scanf 的返回值:-

7.21.6.2p16

fscanf 函数返回EOF 的值,如果 输入失败发生在第一次转换(如果有)之前 完成。否则,函数 返回输入的数量 分配的项目,可能比提供的要少,或者甚至 零,在早期匹配失败的情况下

代码类似于 this。 (这里使用的是scanf)。

最好使用fgets。您可以轻松更好地控制错误输入。使用fgets,您将读取整行,然后使用strtolstrtoul 解析其中的整数输入。是的,在整数输入的情况下,也会出现这种情况 - 您需要检查解析的 long 或 unsigned long 的大小是否合适,以便它们可以保存在 int 变量中。

【讨论】:

  • 谢谢,请详细说明我是 c 的初学者
  • @Ron.:我明白了..但这显然可以理解...我会尝试更清楚地解释。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-11-28
  • 1970-01-01
  • 2017-10-28
  • 2016-03-14
  • 2018-08-14
相关资源
最近更新 更多