我刚刚在一个月前开始学习C,这是我为检测数据列表的峰值而编写的代码。当我在终端中输入“input data.txt”时,它会以某种方式进入无限循环,但当我通过标准输入即键盘手动输入完全相同的数据时,它完全正常。任何想法为什么它会陷入无限循环?
谢谢!
int main(void)
{
int data1 = 0;
int data2 = 0;
int data3 = 0;
int counter = 1;
scanf("%d %d %d", &data1, &data2, &data3);
puts("Number Magnitude");
while (data3!= EOF){
if ((data1<=data2)&&(data2>data3)){
printf("%*d%*d\n", 4,counter,11, data2);
counter++;
}
data1 = data2;
data2 = data3;
scanf("%d", &data3);
}
return 0;
}
答案 0 :(得分:1)
从stdin尝试时如何停止输入?使用Ctrl-Z?
您需要测试scanf
的返回结果:
返回值 成功时,该函数返回成功填充的参数列表的项数。由于匹配失败,读取错误或文件结束的范围,此计数可以匹配预期的项目数或更少(甚至为零)。
如果在读取时发生读取错误或达到文件结尾,则设置正确的指示符(feof或ferror)。并且,如果在成功读取任何数据之前发生了任何一个,则返回EOF。 (http://www.cplusplus.com/reference/cstdio/scanf/)
将循环中的最后一行更改为
if (scanf("%d", &data3) < 1)
break;
- 这也意味着您的while
语句可以更改为
while (1) /* forever */
答案 1 :(得分:0)
scanf("%d", &data3);
以上函数的默认输入流被重定向到
printf("%*d%*d\n", 4,counter,11, data2);
功能的输出。 你必须区分它。
详细代码就是这个。让输入函数(fscanf)读取文件中的数字是好的
#include <stdio.h>
#include <stdlib.h>
int main(int argc, char* argv[])
{
int data1 = 0, data2 = 0, data3 = 0;
int counter = 1;
puts("Number Magnitude");
FILE *fp = fopen(argv[1], "r+");
if(fscanf(fp, "%d %d", &data1, &data2) != EOF){
while (fscanf(fp, "%d", &data3) != EOF) {
if((data1 <= data2) && (data2 > data3)){
printf("%*d%*d\n", 4, counter++, 11, data2);
}
data1 = data2;
data2 = data3;
}
}
fclose(fp);
return 0;
}
输出如下:
$ cat data.txt
3 3 4 5 5 5 4 2 1 191 3 43 2 3 0
$ ./a.out data.txt
数量级 1 5 2 191 3 43 4 3
答案 2 :(得分:0)
我可能会在这里感到困惑,但是当您使用scanf而不是文件时,您正在从默认输入/输出(可能是终端)进行扫描。尝试创建文件指针并使用fscanf。例如
FILE *data;
data=fopen("data.txt", "r+");
fscanf(data,"%d",&data1);
fclose(data);
答案 3 :(得分:0)
首先,您要为data1
,data2
,data3
分配值,并且您还要求用户输入值。您要么输入一个值,要么为这些变量分配一些确定的值。同样在你的while循环EOF
是未定义的,所以将它改为某个值或适当的条件。