使用" for#34;是否正确?循环创建一个检查输入值的循环?

时间:2013-01-24 12:38:19

标签: c loops

我需要编写一个请求两个浮点数的程序并打印出值 他们的差异除以他们的产品,并让程序循环通过成对 输入值,直到用户输入非数字输入。我需要使用scanf来接受输入。

所以,我知道scanf为true / false返回值0或1所以我虽然测试它来完成问题的最后部分,但我想弄清楚如何确保循环返回要求输入。

我的代码是:

int main()    
{        
    double num1, num2, different, product, answer;

    printf("please enter 2 floatig point numbers:\n");
    printf("number one is?\n");
    while (scanf("%lf", &num1) ==1)
    {
        printf("number two is?\n");
        while (scanf("%lf", &num2) ==1)
        {       
            if (num1 > num2)
            {
                different = num1 - num2;
            }

            if (num2 > num1)        
            {
                different = num2 - num1;
            }

            if (num1 == num2)        
            {
                different = 0;
            }

            product = num1*num2;
            answer = different/product;
            printf("%lf", answer);
        }
        printf("you're out!");
    }
    printf("you're out!");
}  

示例输入:

first num 4.5
second num 3.5

输出:

please enter 2 floatig point numbers:
number one is?
4.5
number two is?
3.5
0.063492

我得到了正确的答案,程序一直在运行,但我正在寻找一个解决方案来返回输入请求。

3 个答案:

答案 0 :(得分:1)

它只是一个模式来定义你想要的输入数量。更简单的代码版本是

  while( scanf("%d %d", &a,&b) == 2 )
  //

此处scanf返回2作为返回值。

所以你正在检查while(2 == 2),输入你想要的输入数量

while( scanf("%lf %lf", &num1,&numb2) == 2 )
{
    if (num1 > num2)
    {
        different = num1 - num2;
    }

    if (num2 > num1)
    {
        different = num2 - num1;
    }

    if (num1 == num2)
    {
        different = 0;
    }
    product = num1*num2;
}

答案 1 :(得分:1)

你可以这样做:

while(1)
{
     printf("number one is?\n");
     if(scanf("%lf", &num1) != 1)
     {
       break;
     }
     printf("number teo is?\n");
     if(scanf("%lf", &num2) != 1)
     {
       break;
     }

    if (num1 > num2)
    {
        different = num1 - num2;
    }

    if (num2 > num1)

    {
        different = num2 - num1;
    }

    if (num1 == num2)

    {
        different = 0;
    }

    product = num1*num2;

    answer = different/product;

    printf("%lf", answer);

    }
}

答案 2 :(得分:1)

你应该首先注意到,无论你的scanf第一次失败,都可能会让它第二次失败。所以这样的循环:

while (scanf("%lf", &a) != 1);

可能会变成无限循环

此外,当同时读取两个或多个值时,很难跟踪读取的内容和不读取的内容。因此,我建议逐一阅读这些值,形式如下:

void clear_line()
{
    char c;
    while (scanf("%c", &c) == 1)
        if (c == '\n')
            return;
}

double read_value(const char *message)
{
    double d;

    while (1)
    {
        printf("%s", message);
        if (scanf("%lf", &d) == 1)
            return d;
        if (feof(stdin))
        {
            printf("Unexpected end of file\n");
            return 0;
        }
        printf("Invalid input\n");
        clear_line();
    }
}

...
num1 = read_value("Enter first number: ");
num2 = read_value("Enter second number: ");
if (feof(stdin))
    /* handle error */

这基本上做的是尝试读取值,直到用户生成正确的值。如果输入不正确,则会消耗并丢弃一行输入,因此用户输入的任何内容都不会影响下一个scanf并创建一系列错误。