C无限循环(IF嵌套在FOR LOOP中)

时间:2014-10-20 02:16:11

标签: c for-loop infinite-loop scanf nested-if

我正在尝试创建一个函数,询问用户一个值,然后将其存储为输入的最大值或最小值,或者如果用户输入一个数字< 0,它将退出dataentry()函数,否则它将继续询问用户输入。

#include <stdio.h>
#include <string.h>

void dataentry();

int count = 0;
float max, min, mean, old, new;
float data;
char Old[10],Data[10],choice[25];

int main(void)
{
    dataentry();
}

void dataentry()
{
    printf("  |Enter Wind Speed Value:\n");
    printf("**|Enter -1 to exit data entry mode|**\n");

    fgets(Old, sizeof(Old), stdin);
    sscanf(Old, "%f",&old);

    max = old;
    min = old;
    data = 1;
    count = 1;

    printf("max=%f, min=%f, data=%f, count=%d.", max, min, data, count);

    for (count == 1;data >= 0; count++)
    {
        printf("\nEnter data value: ");

        //fgets(Data, sizeof(Data), stdin);  // I commented this out because I got a coredump error with it in
        sscanf(Data,"%f", &data);
        if (data >= max)
        {
            max = data;
        }
        else if (data <= min && data > 0)
        {
            min = data;
        }
    }
}

程序提示您第一次输入数据后,在它到达for循环之前,它会起作用并输入您的值。然而,它进入无限循环打印“输入数据值:”一遍又一遍。我使用printf语句打印出max,min,data和count值,这样我就可以检查它们是否存储了它们,但是当函数进入for循环时它不再是我正在尝试的做。提前谢谢,这个函数是我写的一个更大的程序的一部分,但是我把所有不相关的东西都删掉了。

1 个答案:

答案 0 :(得分:0)

如果您取消注释fgets()行,它应该可以正常工作。这是一个工作版本,整理一下来检查你没有监控的函数的返回,并改进你的循环逻辑:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

void dataentry(void);

int count = 0;
float max, min, mean, old, new;
float data;
char Old[10], Data[10], choice[25];

int main(void)
{
    dataentry();
}

void dataentry(void)
{
    printf("  |Enter Wind Speed Value:\n");
    printf("**|Enter -1 to exit data entry mode|**\n");

    if ( !fgets(Old, sizeof(Old), stdin) ) {
        fprintf(stderr, "No input.\n");
        exit(EXIT_FAILURE);
    }

    if ( sscanf(Old, "%f", &old) != 1 ) {
        fprintf(stderr, "Badly formed input, enter a float next time.\n");
        exit(EXIT_FAILURE);
    }

    max = old;
    min = old;
    data = 1;
    count = 1;

    printf("max=%f, min=%f, data=%f, count=%d.\n", max, min, data, count);

    while (1) {
        printf("Enter data value: ");
        fflush(stdout);

        if ( !fgets(Data, sizeof(Data), stdin) ) {
            break;
        }

        if ( sscanf(Data, "%f", &data) != 1 ) {
            fprintf(stderr, "Badly formed input, enter a float next time.\n");
            exit(EXIT_FAILURE);
        }

        if ( data < 0 ) {
            break;
        }
        else {
            ++count;
        }

        if ( data >= max ) {
            max = data;
        } else if ( data <= min ) {
            min = data;
        }
    }

    printf("max=%f, min=%f, data=%f, count=%d.\n", max, min, data, count);
}

带样本输出:

paul@thoth:~/src/sandbox$ ./ssf
  |Enter Wind Speed Value:
**|Enter -1 to exit data entry mode|**
10
max=10.000000, min=10.000000, data=1.000000, count=1.
Enter data value: 11
Enter data value: 12
Enter data value: 9
Enter data value: 8
Enter data value: -1
max=12.000000, min=8.000000, data=-1.000000, count=5.
paul@thoth:~/src/sandbox$ 

使用所有这些全局变量也是非常糟糕的形式。至少在目前的程序中,您可以在dataentry()中定义每一个程序。