(对不起,我的英语不好!)
好吧,我正在复制此代码的解决方案。我的代码与解决方案相同(代码正常,做得很好),但是当我运行该程序时,它会显示一条消息,提示Segmentation fault (core dumped)
。我不知道如何向您展示我的程序的截图,但是我的代码似乎还不错。
当我运行程序时,它会在询问商品数量时完成。然后出现以下消息:Segmentation fault (core dumped)
#include <stdio.h>
#define NUM 5
#define MAX_WAGON_CAPACITY 0.85
#define MAX_WAGON_CAPACITY_ANIMALS 0.5
#define LIMIT1 500
#define LIMIT2 2500
#define FRAGILE 1.10
#define DANGEROUS 1.15
#define FIRST_PRICE 0.50
#define SECOND_PRICE 0.45
#define THIRD_PRICE 0.40
typedef enum { FOOD, CHEMICAL, ANIMALS, VEHICLES,
ELECTRONICS, CONSTRUCTION, OTHERS } tGoodType;
typedef enum { FALSE, TRUE } boolean;
int main(int argc, char **argv) {
int idGood;
float volumeGood;
tGoodType typeOfGood;
boolean isFragile;
boolean isDangerous;
float train [NUM];
int nWagons;
float volumeTrain;
float price;
float surchargeFragile;
float surchargeDangerous;
printf("Good identifier: \n");
scanf("%d", &idGood);
printf("\nInsert volume of Good\n");
scanf("%f", volumeGood);
printf("\nInsert Good type (0-FOOD, 1-CHEMICAL, 2-ANIMALS, 3-VEHICLES, 4-ELECTRONICS, 5-CONSTRUCTION, 6-OTHERS)\n");
scanf("%u", &typeOfGood);
printf("\nIs the Good fragile? (0-FALSE, 1-TRUE)\n");
scanf("%u", &isFragile);
printf("\nIs the Good dangerous) (0-FALSE, 1-TRUE\n");
scanf("%u", &isDangerous);
printf("\nThe maximum length of the train is>> ");
scanf("%f", train[0]);
printf("\nThe length of the locomotive is>> ");
scanf("%f", train[1]);
printf("\nThe length of each wagon is>> ");
scanf("%f", train[2]);
printf("\nThe space between each wagon is>> ");
scanf("%f", train[3]);
printf("\nThe volume of a wagon is>> ");
scanf("%f", train[4]);
nWagons = (int)((train[1] - train[2]) / (train[3] + train[4]));
if (typeOfGood == 2)
volumeTrain = nWagons * train[4] * MAX_WAGON_CAPACITY_ANIMALS;
else
volumeTrain = nWagons * train[4] * MAX_WAGON_CAPACITY;
price = 0.0;
surchargeFragile = 0.0;
surchargeDangerous = 0.0;
if (volumeTrain >= volumeGood) {
if (volumeGood > 0 && volumeGood < LIMIT1) {
price = volumeGood * FIRST_PRICE;
} else if (volumeGood >= LIMIT1 && volumeGood <= LIMIT2) {
price = volumeGood * SECOND_PRICE;
} else {
price = volumeGood * THIRD_PRICE;
}
}
if (isFragile == 1) {
surchargeFragile = (price * FRAGILE) - price;
}
if (isDangerous == 1) {
surchargeDangerous = (price * DANGEROUS) - price;
price = price + surchargeFragile + surchargeDangerous;
}
if (price > 0.0) {
printf("The Good id is %d", &idGood);
printf("The number of wagons is %d", &nWagons);
printf("The price for the good is %f", &price);
} else {
printf("The good does not fit the train");
}
return 0;
}
答案 0 :(得分:1)
您的scanf中有几个错误,会产生分段错误,它们由编译器指示:
c.c:38:1: warning: ‘volumeGood’ is used uninitialized in this function [-Wuninitialized] scanf("%f", volumeGood); ^~~~~~~~~~~~~~~~~~~~~~~
和
c.c:38:9: warning: format ‘%f’ expects argument of type ‘float *’, but argument 2 has type ‘double’ [-Wformat=] scanf("%f", volumeGood);
因为 volumeGood 的未定义值用作 scanf 尝试写入的地址
您可能想要
scanf("%f", &volumeGood);
以及所有这些:
c.c:46:9: warning: format ‘%f’ expects argument of type ‘float *’, but argument 2 has type ‘double’ [-Wformat=] scanf("%f", train[0]); ^ c.c:48:9: warning: format ‘%f’ expects argument of type ‘float *’, but argument 2 has type ‘double’ [-Wformat=] scanf("%f", train[1]); ^ c.c:50:9: warning: format ‘%f’ expects argument of type ‘float *’, but argument 2 has type ‘double’ [-Wformat=] scanf("%f", train[2]); ^ c.c:52:9: warning: format ‘%f’ expects argument of type ‘float *’, but argument 2 has type ‘double’ [-Wformat=] scanf("%f", train[3]); ^ c.c:54:9: warning: format ‘%f’ expects argument of type ‘float *’, but argument 2 has type ‘double’ [-Wformat=] scanf("%f", train[4]);
因为 train 中的条目的使用方式就像它们包含您想要的地址一样
scanf("%f", &train[0]);
scanf("%f", &train[1]);
scanf("%f", &train[2]);
scanf("%f", &train[3]);
scanf("%f", &train[4]);
当您使用 scanf 及其等效版本时,必须提供要保存值的地址
也
c.c:84:29: warning: format ‘%d’ expects argument of type ‘int’, but argument 2 has type ‘int *’ [-Wformat=]
printf("The Good id is %d", &idGood);
^
c.c:85:38: warning: format ‘%d’ expects argument of type ‘int’, but argument 2 has type ‘int *’ [-Wformat=]
printf("The number of wagons is %d", &nWagons);
^
c.c:86:40: warning: format ‘%f’ expects argument of type ‘double’, but argument 2 has type ‘float *’ [-Wformat=]
printf("The price for the good is %f", &price);
那时候是相反的,您必须提供地址,而必须提供值,
printf("The Good id is %d", idGood);
printf("The number of wagons is %d", nWagons);
printf("The price for the good is %f", price);