每次整数输入后刷新c输入流

时间:2009-01-26 08:19:47

标签: c

我必须使用户输入num / percent对。代码如下:

while(choice != 0)
{
  printf("enter number");
  fgets(line, sizeof(line), stdin);//sizeof(line) is 6
  sscanf(line, "%d\n", choice);
  if(choice > 0)
  {
    printf("enter percentage\n");
    fgets(percent_line, sizeof(percent_line), stdin);//sizeof(percent_line) = 7
    sscanf(percent_line, "%f", &percentage);
    //add to an array holding numbers vs percentages
  }
}

这个问题是,如果我在第5行输入一个长于6(或5)的字符串,剩下的字符串将进入第10行扫描的字符串,如果我输入的字符串为7(或6)第10行的字符,剩余的输入进入第5行的输入。我想破坏任何剩余的输入。我该怎么做?

4 个答案:

答案 0 :(得分:2)

这不一定是最佳解决方案,但另一种方法可能是使用fscanf()

while(choice != 0)
{
  printf("enter number");
  fscanf(stdin, "%d", &choice);
  if(choice > 0)
  {
    printf("enter percentage\n");
    fscanf(stdin, "%f", &percentage);
    //add to an array holding numbers vs percentages
  }
}

通过这种方式,您不需要临时linepercent_line缓冲区。 fscanf()函数将自动保持读取输入,直到它获得所需内容 - 这意味着如果您只需在“输入数字”提示符处按Enter键,fscanf()函数将不会返回并将保留在输入数字之前读取输入。另外,上面没有实现错误处理,我把它作为练习让读者解决当你输入不是数字时发生的问题。

(请注意,我也将choice更改为&choice,我认为您首先想要这样做。)

答案 1 :(得分:0)

您可以检查\n中是否有line - 如果没有,请在循环中使用fgetc(),直到\n找到,然后继续关注输入。

答案 2 :(得分:0)

我认为后者能很好地完成工作。我不介意有人输入“acbgrt”而不是数字,我只想让程序正常运行。它只会将字符串垃圾转换为0,然后退出循环。

答案 3 :(得分:0)

发生这种情况的原因如下: fgets读取最多且最多小于第二个参数中指定的值。在您的情况下,您要求它读入一个可以容纳6个值的数组,因此它会在此数组中读取5个值。剩下的任何东西都会留在缓冲区中以便以后读取 - 然后你会在第10行阅读。

就丢弃值而言,没有真正的方法可以“刷新”输入缓冲区,或者只是清除其内容。 请尝试以下操作,以清除输入缓冲区:

while (getc(stdin) != EOF);
clearerr(stdin);

希望这有帮助。