2

我一直被这个问题困扰。问题的要求很简单。我要做的就是检查用户输入并允许用户只输入小写字母。另一个约束是我只想使用 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' 变量的值后输入输入字符串,但用户输入清理并未完成,即即使用户输入由大写字符组成的字符串,输出也不是“非法输入” ”(应该是这样),而是“接受输入”。

现在有人可以向我解释一下。我哪里出错了,还是我只是忽略了某些事情并犯了一些愚蠢的错误?

4

2 回答 2

2

fflush()是一种不恰当的清除方式stdin。相反,用于scanf阅读直到EOF或只是

while((c = getchar()) != '\n' && c != EOF) { /* Discard */ }

另外,我建议甚至对诸如 else 之类的单个语句进行范围界定。

于 2012-09-16T11:52:37.017 回答
1

您正在尝试一次又一次地阅读错误的输入。例如,如果您想跳过一个字符,您必须这样做,以防用户输入错误的输入,scanf("%.*s")-> 这将跳过所有内容,直到下一个 \n。

说明:如果 scanf() 失败,它什么也不读取 - 所以,当它再次尝试读取时,它将从之前失败的同一个地方开始。

于 2012-09-16T11:40:40.757 回答