我正在制作一个程序,在开头它说请输入任何数字继续。我想限制字符的输入。我尝试使用下面显示的代码,但是一旦我输入另一个键而不是数字,该过程无限重复,它不会让我第二次输入密钥
考虑到该选项被声明为int,这是我正在使用的逻辑:
option = 0;
while(option < 1 || option > 9)
{
printf("\nPlease press any number to continue and press enter: ");
scanf("%d", &option);
;
}
提前感谢您的帮助
答案 0 :(得分:4)
当scanf
由于输入不是数字而失败时,输入仍保留在流中。因此,当您点击循环的下一次迭代时,它会读取相同的内容并以相同的方式再次失败。
相反,当输入失败时,您应该采取其他措施,例如:
if ( scanf("%d", &option) != 1 )
{
printf("You didn't enter a number.\n");
break;
}
在这种情况下,您可能还需要刷新输入(即丢弃伪造的字符)。据推测,伪造的人物是由有人输入并按Enter键输入的,因此您只需阅读并丢弃所有字符直到换行。这样做的一种方法(有几种,包括花哨的scanf
格式字符串)是:
for ( int ch; (ch = getchar()) != EOF && ch != '\n'; ) { }
答案 1 :(得分:2)
这&#34;否则&#34;你用的没有意义。你只使用&#34; else&#34; &#34; if&#34;。
之后的关键字只需删除其他内容,该程序即可运行。
答案 2 :(得分:0)
这里else
的含义是什么?我们在这里看不到任何if
命令:/
您还需要在scanf("%d", &option);
scanf("\n");
因为,在您输入数字后,它会获得EOF。然后它比较了EOF。所以它会永远循环。
答案 3 :(得分:0)
scanf
仅使用与格式字符串匹配的输入,返回消耗的字符数。任何与格式字符串不匹配的字符都会导致它停止扫描并使无效字符仍在缓冲区中。
在继续之前,您需要从缓冲区中清除无效字符。这是一个非常脏的修复,但它将从输出中删除有问题的字符。
试试这个程序 -
#include<stdio.h>
#include<ctype.h>
int main()
{
int option = 0;
char c = 0;
printf("\nPlease press any number to continue and press enter: ");
scanf("%d", &option);
while(option >=1 && option <= 9){
printf("\nPlease press any number to continue and press enter: ");
if (scanf("%d", &option) == 0) { //consume non-numeric chars from buffer
printf("Please Enter a number\n");
do {
c = getchar();
}
while (!isdigit(c));
}
else
// do your stuff here
;
}
return 0;
}