下面的while循环在添加一个字母时中断。我希望它在添加一个字母时继续循环,以及添加一个负数时继续循环。下面是我当前的代码:
float monthpay;
printf("Please enter your monthly wage:\t");
scanf("%f", &monthpay);
while (monthpay <= 0)
{
printf("\nThat was invalid");
printf("\n Please try again: ");
scanf("%f", &monthpay);
}
printf("%.2f", monthpay);
我试着做一个循环,如果错误地添加了一个字母,它就会循环。
3条答案
按热度按时间velaa5lx1#
scanf()
返回已成功匹配和赋值的输入项的数目。如果不检查返回值(rv
),则变量(monthpay
)可能未初始化,使用它是未定义的行为。oxosxuxt2#
在尝试扫描
float
之后,扫描并丢弃除换行符之外的空白,扫描丢弃并计数任何剩余的非换行符字符,扫描换行符。%n
说明符将提供扫描处理的字符计数,直到该说明符为止。扫描集
%*[ \t\f\v]
中的星号指示scanf丢弃匹配字符。扫描集%*[^\n]
中的插入符号指示scanf处理不匹配字符,因此将丢弃所有不是换行符的字符。%1[\n]
指示scanf扫描一个字符,并且该字符必须是换行符。如果输入浮点数后仅跟空格,当scanned
将为2且extra
将为0时,循环将退出。sg24os4d3#
在尝试使用结果之前,应始终检查
scanf
的返回值,以确定输入是否已成功转换。但是,对于基于行的用户输入,使用函数
scanf
通常是不可取的,因为它的行为不直观,它通常不消耗整行输入,这会引起各种各样的麻烦,例如scanf
在输入流上留下换行符会引起this问题,如果用户输入6abc\n
,那么情况就更糟了:在这种情况下,scanf
将匹配6
作为有效输入,但将abc\n
保留在输入流中,这很可能导致下一个输入操作无法按预期运行,除非您事先从输入流中显式丢弃该行的剩余部分。由于上述原因,通常最好总是一次将整行输入作为字符串读取,例如使用函数
fgets
,然后可以使用函数strtof
尝试将字符串转换为数字。下面是一个执行大量输入验证的示例:
此程序具有以下行为:
我在上面的代码中使用的函数
get_float_from_user
是基于this answer of mine to another question中的函数get_int_from_user
的,关于该函数如何工作的进一步解释,请参见上面的答案。