validationdo-while循环C中的输入类型
基本上,我需要确保输入是一个整数 ,如下所示:
do { printf("Enter > "); scanf("%d", &integer); } while (/* user entered a char instead of an int */);
我尝试了各种方法,但是当我尝试输入char
时,它总是以运行时错误或无限循环结束。 我知道fflush(stdin)
是一个未定义的行为,最好不要将它包含在我的代码中以防止任何错误加上它由于某些原因在VS2015中不再起作用 。
下面的代码是我尝试过的方法:
typedef enum {false, true} bool; int ipt; char c; bool wrong_ipt; do { c = '\0'; printf("Enter > "); scanf("%d%c", &ipt, &c); //infinite loop occurs while a char has been entered } while (c != '\n'); do { c = '\0'; printf("Enter > "); } while (scanf("%d", &ipt) != EOF); do { wrong_ipt = false; do { ipt = NULL; printf("Enter > "); scanf("%d", &ipt); if (ipt == NULL) { wrong_ipt = true; break; } } while (ipt == NULL); } while (wrong_ipt);
除了fflush(stdin)
什么可以用来防止用户在C中输入char
时的无限循环?
谢谢
问题是“scanf()”可能会在您的输入缓冲区中留下未读数据。 因此,“无限循环”。
另一个问题是你应该从scanf()
validation返回值。 如果你期望一个整数值……并且scanf返回“0”项读取…那么你就知道出了什么问题。
这是一个例子:
#include void discard_junk () { char c; while((c = getchar()) != '\n' && c != EOF) ; } int main (int argc, char *argv[]) { int integer, i; do { printf("Enter > "); i = scanf("%d", &integer); if (i == 1) { printf ("Good value: %d\n", integer); } else { printf ("BAD VALUE, i=%i!\n", i); discard_junk (); } } while (i != 1); return 0; }
样本输出:
Enter > A BAD VALUE, i=0! Enter > B BAD VALUE, i=0! Enter > 1 Good value: 1
‘希望有所帮助!
你的根本错误是你永远不会告诉你的程序消耗无效的输入。 用语言说,你告诉程序:
- 如果有,则读取整数。 (否则什么都不读)
- 如果没有得到整数,请返回步骤1。
我假设你以为你在做什么
- 读取输入,如果是整数,则存储它。
- 如果它不是整数,请返回步骤1。
所以你需要做的是重写你的代码,以便它做你想做的事情(或者提出一些其他的方法,如在另一个答案中)。 也就是说,将您的程序编写为:
- 阅读一些输入量。 (例如一条线)
- 扫描输入以查看它是否为整数,然后存储它。
- 如果它不是整数,请返回步骤1。
您可能会发现一些有用的相关function是fgets
, sscanf
和atoi
。 (另外,试着抵制写错误代码的诱惑;例如,如果你打算阅读一行输入,请确保你真正这样做 ,并且正确 。很多人都很懒,如果行很长就会做错事;例如,只是读取部分行,或导致缓冲区溢出)
格式说明符%d告诉scanf
在命令行中需要一个整数值。 当用户输入一行数据时,它将被读取为字符串,然后scanf
尝试了解输入的字符串是否可以解释为整数的十进制数字。
如果此解释成功,那么找到的值将存储在作为参数传递的整数变量中。
scanf
完成的rigth替换次数由该函数以int
值的forms检索。 由于您只需要一个输入,因此值1表示一切正常。
因此,如果存在错误,例如,用户输入了无效的整数,则scanf
的数字小于格式说明符的数量。 在这种情况下,小于1的值通知发生错误:
int ipt, succeded; do { printf("ipt? "); succeded = scanf("%d", &ipt); if (succeded < 1) { // Clean the input while (getchar() != '\n') ; } } while(succeded < 1);