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

Posted

技术标签:

【中文标题】C 无限循环(如果嵌套在 FOR LOOP 中)【英文标题】:C Infinite loop (IF nested in FOR LOOP) 【发布时间】:2014-10-20 02:16:11 【问题描述】:

我正在尝试创建一个要求用户输入值的函数,然后将其存储为输入的最大值或最小值,或者如果用户输入的数字

#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 语句打印出最大值、最小值、数据和计数值,因此我可以检查它们是否被存储并且它们是,但是当函数进入 for 循环时,它不再执行我想要的操作做。提前谢谢你,这个函数是我正在编写的一个更大程序的一部分,但我把所有不相关的东西都删掉了。

【问题讨论】:

“我把它注释掉了,因为我得到了一个 coredump 错误” - 并且让你自己处于试图从一个你从未初始化过的 char 数组中读取的情况,这不是进展. 看到这个,需要在sscanf中加“%n”。 ***.com/questions/3975236/how-to-use-sscanf-in-loops 您有一个 sscanf 正在从字符串中读取值。但是您注释掉了试图从标准输入读取一个值到字符串字符串的行。修复该行而不是禁用它。或者获取数据 somewhere... 的非负值 我们的教授刚刚向我们介绍了 sscanf() 而不是使用 scanf(),而且我对它的工作原理仍然很陌生,所以我不知道我使用的是未初始化的字符串,谢谢! 你的教授应该告诉你第一你总是做的事情是检查所有IO api的返回结果。我可以看到通过 printf 调用,但 fgetssscanf 调用应该 all 进行检查以进行验证,而不是盲目地假设它们有效。假设是一切的母亲...... 【参考方案1】:

如果您取消注释 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() 中定义它们中的每一个。

【讨论】:

以上是关于C 无限循环(如果嵌套在 FOR LOOP 中)的主要内容,如果未能解决你的问题,请参考以下文章

RecyclerView里面嵌套一个无限循环的横向列表该怎么做

RecyclerView里面嵌套一个无限循环的横向列表该怎么做

c ++:嵌套for循环的动态数量(无递归)

C++入门基础知识[3]——循环嵌套循环无限循环

无限循环与嵌套循环

为啥我的代码在执行时的初始嵌套 for 循环中进入无限循环?