C 如何防止无限stdin循环?

C 如何防止无限stdin循环?,c,while-loop,C,While Loop,我正试图为一个练习题编写一个简单的程序,如下所示: (销售佣金计算器)一家大型化工公司向其销售人员支付com- 任务基础。销售人员每周可获得200美元,外加该周总销售额的9%。例如,一名销售人员在一周内销售价值5000美元的化学品,可获得200美元外加9%的利润 5000美元,或总共650美元。开发一个程序,输入每个销售人员去年的总销售额 并将计算和显示该销售人员的收入。一次处理一位销售人员的数据 时间 我试图处理用户是否输入数字以外的内容,例如字符串/字符。但是,当我尝试运行它并通过输入字符串

我正试图为一个练习题编写一个简单的程序,如下所示:

(销售佣金计算器)一家大型化工公司向其销售人员支付com- 任务基础。销售人员每周可获得200美元,外加该周总销售额的9%。例如,一名销售人员在一周内销售价值5000美元的化学品,可获得200美元外加9%的利润 5000美元,或总共650美元。开发一个程序,输入每个销售人员去年的总销售额 并将计算和显示该销售人员的收入。一次处理一位销售人员的数据 时间

我试图处理用户是否输入数字以外的内容,例如字符串/字符。但是,当我尝试运行它并通过输入字符串/字符来测试它时,它会一直循环,直到VSC崩溃

我的代码:

#包括
#包括
内部主(空){
浮动销售额=0;
浮动工资=0;
while(销售!=-1)
{
printf(“以美元输入销售额(-1到结尾):”;
scanf(“%f”、&sales);
而((销售!=-1)和&!(销售>=0))
{
puts(“输入错误,请重试”);
fflush(stdin);
printf(“以美元输入销售额(-1到结尾):”;
scanf(“%f”、&sales);
}
如果(销售!=-1)
{
工资=200+(0.09*销售额);
printf(“工资为:$%.2f\n”,工资);
}
}
返回0;
}
我在另一个程序中使用了类似的方法,效果很好,所以我不知道这里有什么问题

另一个程序的代码:

while(!(已收集>=0))
{
fflush(stdin);
puts(“输入错误,请重试”);
printf(“输入收集的总金额(-1以退出):$”;
scanf(“%f”,&collected);
}
如能解释,将不胜感激

scanf(“%f”,…)
永远不会接受任何格式不正确的数字,因此如果您输入字符,所有
scanf()
调用只会看到有一个字符要使用,但格式说明符不允许,它们不会读取任何内容并返回
0
。这加上您的
while
,如果输入了任何无效的数字,将导致无休止的循环

您必须读取到行尾的所有内容,或者在
scanf
返回
0
时跳过不需要的字符(这意味着它无法正确读取任何值)。另外,检查
scanf
是否返回
EOF
,这意味着存在错误或到达了文件末尾

无论如何,千万不要这样做

正确的方法是:

#包括
内部主(空){
浮动销售额=0;
浮动工资;
国际关系;
做{
printf(“以美元输入销售额(-1到结尾):”;
fflush(stdout);
res=scanf(“%f”、&sales);
如果(res==EOF){
//坏事情发生了。
if(feof(stdin))
fputs(“已到达输入端。\n”,stderr);
其他的
perror(“错误读取输入”);
返回1;
}
if(销售!=-1&&sales<0){
//也许在这里说“无效值”会更好?
puts(“输入错误,请重试”);
res=0;
}
//值的读取正确(res=1)或不正确(res=0)。
//在任何情况下,都要消耗剩下的部分。
scanf(“%*[^\n]”);
}而(res!=1&&sales!=-1.0);
如果(销售!=-1.0){
工资=200+(0.09*销售额);
printf(“工资为:$%.2f\n”,工资);
}
返回0;
}

始终检查输入流未定义的
scanf()
fflush
的返回值;使用
fflush(stdin)
不能保证工作(也不能保证不工作,但不应该依赖它)。我的终端上的输出循环如下所示(对于我的原始代码):输入美元销售额(-1到结尾):工资是:$200.00输入美元销售额(-1到结尾):薪水是:$200.00为什么它不运行嵌套的while循环,只通过if选择?我的意图是,如果用户输入了错误的格式,它将被while嵌套循环捕获,他们将被迫修复它。@lowkeyhuman我犯了一个小逻辑错误,我已经编辑了代码,请再次检查它。您不需要嵌套循环,一个循环就足够了。Nit-
%f
将跳过前导空格,格式字符串中的前导空格不是必需的。