scanf无限循环

时间:2012-03-26 01:09:34

标签: c scanf

此程序获取文件中的第一个数字,并指示其后的数字,然后使用后面的数字执行各种其他操作。

似乎scanf在尝试从文件中读取时会导致无限循环。我运行程序的时候甚至不能检查1工作

以下是代码:

#include <stdio.h>

int main(void) {
        int N, a, n;
        int x=0;
        int t=0;
        printf("1"); //Check
        scanf("%d", &N);
        printf("2"); //Check
        int nums[N];
        int i;
        printf("%d", &N);  //Check
        for (i=0; i<N; i++)
        {
                scanf("%d", &nums[i]);
                t+=nums[i];

                if (nums[i] > x) x=nums[i];

                if (i=0 || nums[i] < n) n = nums[i];
        }
        a = t/N;   
        printf("Number Processed: \t%d\n", &N);
        printf("Maximum: \t%d\n", &x);
        printf("Minimum: \t%d\n", &n);
        printf("Total: \t%d\n", &t);
        printf("Average: \t%d\n", &a);
}

我运行程序的方式是

gcc -lab16
./a.out <in1

其中in1是文本并且具有数字

7
6
-30
90
3903
-934
443
445

感谢您的时间。

3 个答案:

答案 0 :(得分:5)

if (i=0 || nums[i] < n) n = nums[i];

你正在分配i = 0,所以循环永远不会真正前进!你可能想要i == 0。这导致无限循环。

其他问题:int nums[N]; - 如果您想要一个动态[在运行时确定]大小的数组,您可能需要malloc()它。

更新:请注意int nums[N]在C99中有效,因此,如果您的分配假设是C99,则不必担心此问题。否则 - 将需要malloc()

int* nums = (int*) malloc(sizeof(int) * N)

在程序结束之前不要忘记free(nums),否则会导致内存泄漏。

答案 1 :(得分:1)

if (i=0 || nums[i] < n) n = nums[i]; 

这是罪魁祸首。在进行比较时,您正在进行作业i=0i==0

你的循环变为无穷大,因为每当你到0时都会。

此外,您给我们的代码给了我一个错误,因为您在运行时创建了新的变量。

#include <stdio.h> 
#include "stdlib.h"
int main(void) { 
    int N, a, n; 
    int x=0; 
    int t=0; 
    int i; 
    int *nums;

    printf("1"); //Check 
    scanf("%d", &N); 
    printf("2"); //Check 

    nums = malloc(N*sizeof(int));

...

答案 2 :(得分:1)

此代码存在许多问题。

你错误地将作业用于比较:

i=0

i设置为零。你可能意味着

i==0

检查i是否等于零。

您应该检查scanf()返回的值。当scanf()读取的数据不符合您指定的格式时,它会将数据保留在缓冲区中,下一次调用scanf()会再次看到相同的数据。

第一个printf()没有打印任何内容的原因很可能是您没有打印任何换行符。请注意,在某些输出设备上,如终端输出是行缓冲的。

您正在将指向变量的指针传递给printf(),但您的格式指定了%d。你可能意味着变量本身,而不是指向它的指针。

此外,如果需要一个长度依赖于仅在运行时知道的值的数组,则需要在堆上分配它,例如:使用malloc()