C程序工作正常(但输出正确),但仍然崩溃

问题描述:

该程序计算输入城市之间的距离 笛卡儿坐标系统并输出最近的两个城市。C程序工作正常(但输出正确),但仍然崩溃

该程序编译没有问题,所以它必须是一个逻辑错误,但一旦最后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); 
} 
+0

你的城市名称的大小是多少?如果> 15,那么你有问题。尝试使用'scanf(“%15s”,g [i] .name);'使输入安全 –

+0

btw:'for(j = 0; j 'for(j = i + 1; j

+0

@ Jean-FrançoisFabre感谢您的建议,不幸的是我已经尝试将for循环更改为确切的格式,如果城市之间的距离差异很大(〜6),它仍然崩溃,并且只适用于最后2个输入的城市 –

的实际碰撞可能来自您忘记使用它们之前初始化maximaxj的事实。由于循环中的条件不一定遇到,因此初始化maxdistance时应将其设置为0和1。

+0

这么做了!非常感谢! –

+1

当距离(g [0],g [1]);'确实是最大距离 –

+0

不应该将maxdistance初始化为MAX_DOUBLE,还是在C中调用最大的双精度值? – Adder