#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#define MAX_SIZE 100
我正在尝试根据它们与原点的距离来快速输入一组2D点,但我的代码在第一个Seg fault
之后命中scanf
。
typedef struct point{
double x;
double y;
double dist;
} point;
void sortpoints(point arr[], int low, int high);
void printpoints(point arr[], int n);
排序点只是对Point structs
数组排序的快速排序的操纵,具体取决于Point.dist
void sortpoints(point arr[], int low, int high){
int piv, i, j;
piv = low;
i = low;
j = high;
point box;
if(low < high){
while(i<j){
while((arr[i].dist)<=(arr[piv].dist) && i<= high)
i++;
}
while((arr[j].dist) > (arr[piv].dist) && j>= low)
j--;
}
if(i<j){
box = arr[i];
arr[i] = arr[j];
arr[j] = box;
}
box = arr[j];
arr[j] = arr[piv];
arr[piv] = box;
sortpoints(arr, low, j-1);
sortpoints(arr, j+1, high);
}
打印点只按照距原点
的距离顺序打印点 void printpoints(point arr[], int n){
int i; for(i = 0; i <= n; i++){
printf("(%.2lf, %.2lf)\n", arr[i].x, arr[i].y);
}
}
用户输入表格中点数和点数的值(point.x,point.y)
int main(){
point pointa;
point pointarray[MAX_SIZE];
int n=0;
printf("how many points would you like to enter?\n");
scanf("%d", &n);
if(n<MAX_SIZE){
int i;
for(i=0; i<n ; i++){
scanf("(%lf,%lf)", &pointa.x, &pointa.y);
pointa.dist = sqrt(pointa.x*pointa.x + pointa.y*pointa.y);
pointarray[i] = pointa;
}
sortpoints(pointarray, 0, n-1);
printpoints(pointarray, n);}
else{
printf("sorry, not a valid array size\n");
}
return 0;
}
答案 0 :(得分:1)
当我改变这一行时:
scanf("(%lf,%lf)", &pointa.x, &pointa.y);
对此:
scanf("%lf,%lf", &pointa.x, &pointa.y);
点数值实际上正在被读入,其中没有任何内容被读入,我在scanf
的文档中没有看到任何关于此的内容,但有人熟悉这个吗?
您排序代码似乎进入无限递归并导致堆栈溢出。
答案 1 :(得分:1)
我有堆栈溢出。
您的程序调用函数sortpoints
,并自行调用(sortpoints
调用sortpoints
)。但我无法看到sortpoints
必须停止的地方!
因此,j-1
无效,arr[j]
根本无效。
答案 2 :(得分:0)
你的问题在于你的大括号。我已经稍微重新格式化了您的分类点功能,因此每个基本块实际上更清晰。
void sortpoints(point arr[], int low, int high){
int piv, i, j;
piv = low;
i = low;
j = high;
point box;
if(low < high){
while(i<j){
while((arr[i].dist)<=(arr[piv].dist) && i<= high)
i++;
}
while((arr[j].dist) > (arr[piv].dist) && j>= low)
j--;
}
if(i<j){
box = arr[i];
arr[i] = arr[j];
arr[j] = box;
}
box = arr[j];
arr[j] = arr[piv];
arr[piv] = box;
sortpoints(arr, low, j-1);
sortpoints(arr, j+1, high);
}
现在应该很明显,你的段错误是意外无限递归的结果。即使使用单个语句,这也是使用{ }
进行循环的一个很好的论据。