C中的Do-While循环不重复

时间:2015-03-20 06:01:43

标签: while-loop

如果我回答“-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);
}

2 个答案:

答案 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);