C程序可以工作(并给出正确的输出),但无论如何都会崩溃

C程序可以工作(并给出正确的输出),但无论如何都会崩溃,c,struct,compare,C,Struct,Compare,该程序计算输入的城市之间的距离 笛卡尔坐标系,并输出最近的2个城市 程序编译时没有问题,因此它一定是一个逻辑错误,但一旦最后两个城市之间的距离过大(大于其他城市之间的距离),程序就会崩溃 当我在接近结尾的if语句中编写printf时,它只显示if被访问过一次,这是不可能的,因为如果输入3个城市,i和j应该是不同的6/9组合 #include <stdio.h> #include <stdlib.h> #include <math.h> typedef stru

该程序计算输入的城市之间的距离 笛卡尔坐标系,并输出最近的2个城市

程序编译时没有问题,因此它一定是一个逻辑错误,但一旦最后两个城市之间的距离过大(大于其他城市之间的距离),程序就会崩溃

当我在接近结尾的if语句中编写printf时,它只显示if被访问过一次,这是不可能的,因为如果输入3个城市,i和j应该是不同的6/9组合

#include <stdio.h>
#include <stdlib.h>
#include <math.h>
typedef struct{
    char name[16];
int x;
int y;
}city;

double distance(city a,city b)
{
double d;
d = sqrt((b.x-a.x)*(b.x-a.x) +(b.y-a.y)*(b.y-a.y));
return d;
}

int main()
{
    int n,i,j;
    city *g;
printf("Input number of cities: ");
scanf("%d",&n);
g = (city*)malloc(n*sizeof(city));
for(i=0;i<n;i++)
{
printf("Input name: ");
scanf("%s",g[i].name);
printf("Input x: ");
scanf("%d",&g[i].x);
printf("Input y: ");
scanf("%d",&g[i].y);
}
int maxi,maxj;
double maxdistance;

maxdistance=distance(g[0],g[1]);
for(i=0;i<n;i++){ 
    //printf("i:%d\n",i);
    for(j=0;j<n;j++)
    {
        //printf("j:%d\n",j);

{ 
        if((distance(g[i],g[j]) < maxdistance) && (i!=j))
        {
            printf("debugcheck");
maxdistance = distance(g[i],g[j]);
maxi = i;
maxj = j;
        }
}

    }

}
printf("Least distance is %lf between %s and %s",distance(g[maxi],g[maxj]),g[maxi].name,g[maxj].name);
}
#包括
#包括
#包括
类型定义结构{
字符名[16];
int x;
int-y;
}城市;
双倍距离(城市a、城市b)
{
双d;
d=sqrt((b.x-a.x)*(b.x-a.x)+(b.y-a.y)*(b.y-a.y));
返回d;
}
int main()
{
int n,i,j;
城市*g;
printf(“输入城市数:”);
scanf(“%d”和“&n”);
g=(城市*)malloc(城市规模);

对于(i=0;i实际崩溃可能是因为您在使用它们之前忘记初始化
maxi
maxj
。因为循环中的条件不一定会遇到,所以在初始化
maxdistance
时,您应该将它们设置为0和1。您的城市名称的大小是多少?如果>15,则您有问题。T用
scanf(“%15s”,g[i].name);
为(j=0;j
为(j=i+1;j@Jean-Françoisfare感谢您的建议,不幸的是,我已经尝试将for循环更改为精确的格式,如果城市之间的距离差异很大,它仍然会崩溃(~6)并且只适用于最后2个输入的城市。请定义“崩溃”!你是“核心转储”、“分段错误”还是什么?如果你的“崩溃”,用户Falderol建议用
return(0)
语句结束
main
,这可能很重要只是你的操作系统报告了main的非零返回值!就是这样!非常感谢!当
distance(g[0],g[1]时会发生这种情况)
确实是最大距离。是否应该将maxdistance初始化为max_DOUBLE,或者在C中调用任何最大的DOUBLE?@PaulOgilvie Oooooh!这很有意义!谢谢!不客气。@Adder是的,另一个解决方案可能是将
maxdistance
初始化为DBL_max。