0

一个月前我刚刚开始学习 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;
}
4

4 回答 4

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;
}

输出如下:

$猫数据.txt

3 3 4 5 5 5 4 2 1 191 3 43 2 3 0

$ ./a.out 数据.txt

数量 大小 1 5 2 191 3 43 4 3

于 2013-07-28T01:33:51.610 回答
0

从标准输入尝试输入时如何停止输入?使用 Ctrl-Z?

您需要测试您的返回结果scanf

返回值 成功时,函数返回参数列表中成功填充的项目数。由于匹配失败、读取错误或到达文件结尾,此计数可以与预期的项目数匹配或更少(甚至为零)。

如果发生读取错误或读取时到达文件结尾,则设置正确的指示符(feof 或 ferror)。并且,如果在任何数据可以成功读取之前发生任何一种情况,则返回 EOF。( http://www.cplusplus.com/reference/cstdio/scanf/ )

将循环中的最后一行更改为

if (scanf("%d", &data3) < 1)
   break;

-- 这也意味着您的while语句可以更改为

while (1) /* forever */
于 2013-07-28T01:26:33.153 回答
0

我在这里可能会感到困惑,但您在使用 scanf 时从默认输入/输出(可能是终端)扫描,而不是文件。尝试创建一个文件指针并使用 fscanf。例如

FILE *data;
data=fopen("data.txt", "r+");
fscanf(data,"%d",&data1);
fclose(data);
于 2013-07-28T02:14:39.633 回答
0

首先,您将值分配给data1, data2data3并且您还要求用户输入值。您要么要求输入值,要么为这些变量分配一些确定的值。同样在您的 while 循环EOF中未定义,因此将其更改为某个值或适当的条件。

于 2013-07-28T06:25:37.263 回答