如果我回答“-1.01”这样的负数,则不会重复此代码。如何让它循环以便再次询问c?
#include <stdio.h>
main()
{
float c;
do {
printf("O hai! How much change is owed? ");
scanf("%.2f", &c);
} while (c < 0.0);
return(0);
}
答案 0 :(得分:1)
scanf
的格式字符串与printf
的格式字符串略有不同。您只能拥有(按C11 7.21.6.2 The fscanf function /3
):
*
。因此,当您找到.
字符时,您的格式说明符将变为非法,这不是有效选项之一。根据上面列出的C11部分的/13
:
如果转换规范无效,则行为未定义。
对于输入,最好使用最基本的格式字符串,以便格式不会太严格。 I / O的一个好的经验法则是:
在你接受的内容中保持自由,特别是你所生成的内容。
因此,代码更好地编写如下,包括许多人忽略的内容,scanf
本身可能失败的可能性,导致无限循环:
#include <stdio.h>
int main (void) {
float c;
do {
printf ("O hai! How much change is owed? ");
if (scanf ("%f", &c) != 1) {
puts ("Error getting a float.");
break;
}
} while (c < 0.0f);
return 0;
}
如果您正在使用更通用的输入解决方案,您希望允许用户输入任何内容,处理缓冲区溢出,处理提示等等,每个C开发人员最终都会提出标准的想法获得投入的方式都有缺陷。因此,他们通常会自己编写,以便获得更多控制权。
例如,here's one提供所有功能和更多功能。
一旦您将用户的输入作为字符串,您就可以根据需要检查并使用它,包括使用scanf
做任何事情,使用{ {1}}代替(如果初始传递数据不成功,可以返回并反复执行)。
答案 1 :(得分:0)
scanf("%.2f", &c );
// ^^ <- This seems unnecessary here.
请坚持基础。
scanf("%f", &c);
如果您想将输入限制为2位数,
scanf("%2f", &c);