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
调用,但 fgets
和 sscanf
调用应该 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里面嵌套一个无限循环的横向列表该怎么做