我必须使用户输入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行的输入。我想破坏任何剩余的输入。我该怎么做?
答案 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
}
}
通过这种方式,您不需要临时line
和percent_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);
希望这有帮助。