我一直被这个问题困扰。问题的要求很简单。我要做的就是检查用户输入并允许用户只输入小写字母。另一个约束是我只想使用 scanf() 来完成它。我知道我可以使用 gets() 和其他输入函数,但是为了更好地理解它,我还是想使用 scanf() 来做到这一点。
我在 GCC 上尝试了以下方法:
char str[100000];
return_value=scanf("%99999[a-z]",str);
if(return_value==0 || return_value==EOF)
{
printf("illegal input");
}
else
printf("input accepted");
以下工作绝对符合预期。因此,如果用户尝试以大写字母输入任何字符串,代码只会打印出:“非法输入”。
当我尝试将上述代码放入有限的 while 循环时,问题就出现了。例如:
int counter=0;
char str[100000];
scanf("%2d",&counter);
while(counter>0)
{
fflush(stdin);
return_value=scanf("%99999[a-z]",str); //note
if(return_value==0 || return_value==EOF)
{
printf("illegal input");
}
else
printf("input accepted");
counter--;
}//end of while
在上述情况下,只要用户输入变量“counter”的值并按下回车键,控件就会立即运行并打印“非法输入”,甚至无需等待用户输入字符串。
为了更正此错误,我尝试将以下内容代替标记为注释的行:
return_value=scanf("%99999s[a-z]",str); //note
甚至这个:
return_value=scanf("%99999c[a-z]",str); //note
在任何一种情况下,尽管允许用户在输入 'counter' 变量的值后输入输入字符串,但用户输入清理并未完成,即即使用户输入由大写字符组成的字符串,输出也不是“非法输入” ”(应该是这样),而是“接受输入”。
现在有人可以向我解释一下。我哪里出错了,还是我只是忽略了某些事情并犯了一些愚蠢的错误?