此程序获取文件中的第一个数字,并指示其后的数字,然后使用后面的数字执行各种其他操作。
似乎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
感谢您的时间。
答案 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=0
:i==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()
。