Hello Stackoverflow工作人员。我是一个非常业余的C程序员,我正在编写一个程序,读取有关结婚礼物的一些信息,然后输出包含最大礼品价值,最低礼品价值,礼品价值的总平均值以及在x> 1处估价的礼物的平均值我已经完成了所有内容的编写,但程序在第一次循环后似乎总是崩溃。我在过去的几个小时里一直在关注它,所以我在找出错误可能是什么问题。这是我的代码:
#include <stdio.h>
#include <stdlib.h>
int main() {
//Opens the file and creats a pointer for it.
FILE *ifp;
ifp = fopen("gifts.txt", "r");
//Declares the variables
int i, j, k, l, m, n, o, p, q, x, y;
int gift_sets, num_gifts, prices, max_value, max, avg_val, no_zero;
//Scans the file and assigns the first line to variable "gift_sets"
fscanf(ifp, "%d", &gift_sets);
//Begins a for loop that repeats based on the value of gift_sets
for (i = 0; i < gift_sets; i++) {
printf("Wedding Gifts #%d\n", i + 1);
printf("Gift Value\t Number of Gifts\n");
printf("----------\t ---------------\n");
//Scans the price values into the array prices[num_gifts]
fscanf(ifp, "%d", &num_gifts);
int prices[num_gifts];
//Creates a loop through the prices array
for (j = 0; j < num_gifts; j++){
fscanf(ifp, "%d", &prices[j]);
}
//Declares a frequency array
int freq[max + 1];
for (k = 0; k <= max; k++) {
freq[k] = 0;
}
for (l = 0; l < num_gifts; l++) {
freq[prices[l]]++;
}
for (m = 0; m < max + 1; m++) {
if (freq[m] > 0){
printf("%d\t%d",m, freq[m]);
}
}
printf("\n");
//Zeroes the variable "max_val."
int max_val = prices[0];
//Loops through the array to find the maximum gift value.
for (n = 0; n < num_gifts; n++){
if (prices[n] > max_value)
max_value = prices[n];
}
// Zeroes "min_val."
int min_val = prices[0];
//Finds the lowest value within the array.
for(o = 0; o < num_gifts; o++){
if(prices[o] !=0){
if(prices[o] < min_val){
min_val = prices[o];
}
}
}
//Calculates the total number of gifts.
double sum_gifts = 0;
for(p = 0; p < num_gifts; p++){
sum_gifts = sum_gifts + prices[p];
}
//Calculates the average value of all the gifts.
avg_val = (sum_gifts / num_gifts);
//find non zero average
double x = 0;
int y = 0;
for(q = 0; q < num_gifts; q++){
if (prices[q] != 0){
x += prices[q];
y++;
}
}
//Calculates the average value of the gifts, excluding the gifts valued zero.
int no_zero = x / y;
//Prints the maximum gift value.
printf("The maximum gift value is: $%d", max_value);
printf("\n");
//Prints the minimum gift value.
printf("The minimum gift value is: $%d\n", min_val);
//Prints the average of all the gifts.
printf("The average of all gifts was $%.2lf\n",avg_val);
//Prints the no zero average value of the gifts.
printf("The average of all non-zero gifts was $%.2lf",no_zero);
printf("\n\n\n");
}
return 0;
}
提前感谢帮助人员。一如既往,非常感谢。
编辑:进一步说明,“崩溃”是执行程序时“gift.exe已停止工作”的Windows错误。它确实在窗口底部说“处理返回-1073741819&lt; 0xC0000005&gt;”
答案 0 :(得分:3)
当您使用num_gifts变量声明数组时,它会生成汇编指令,这些指令在堆栈上分配足够的空间来容纳num_gifts整数。它在编译时执行此操作。通常这不会编译,但是根据ms c编译器的行为,它可以编译并假设默认情况下放在num_gifts中的任何值(可能是0,可能是别的)是长度。当您访问它时,您可能正在尝试访问具有零元素的数组,这可能会导致访问冲突。
答案 1 :(得分:2)
我会马上告诉你应该做的一件事。
检查fscanf
及其兄弟的返回值。如果由于某种原因扫描失败,这将返回少于您的预期(它返回成功扫描的项目数)。
在这种情况下,您的数据文件不是您的代码所期望的。
您还应该检查ifp
是否为NULL - 这可能是因为您无论如何盲目地使用它。
您在IDE中可以找到的一件事是您可能不在您认为自己所在的目录中(特别是gifts.txt
所在的目录。)
最重要的是,max
设置为任意值,因此int freq[max+1];
将为您提供一个不确定大小的数组。如果该大小小于最大价格,您将使用以下内容修改超出数组末尾的内存:
freq[prices[l]]++;
这是一个明确的禁忌,“未定义的行为”领域。
答案 2 :(得分:1)
至少乍一看,在您(尝试)使用它来定义max
数组之前,您似乎尚未初始化freq
。