- 论坛徽章:
- 0
|
又遇到新问题
你的意思是strcmp函数原型是int strcmp(const char * s1,const char * s2)所以numcmp的参数也要换成const的指针是吗?
我现在将程序完成后编译是通过了,运行时又遇到了一个段错误,我用gdb调试逐步执行,发现是到85行出现的这个错误,想了好久找了好久还是不知道错误究竟出在哪啊?现再一次把完整代码帖出,希望能得到大家的帮助。85行strcpy(p,line);已经加粗。
/*此程序实现的功能对输入的文本行用快速排序算法进行排序,排序时分为两种情况当命令行参数为-n时按数字大小排序,否则按照首字符的ASCII码排序*/
#include<stdio.h>
#include<string.h>
//#include<stdlib.h>
#define MAXLINES 5000//待排序的最大行数
#define MAXLEN 1000/*每个输入文本行的最大长度*/
char * lineptr[MAXLINES];
int readlines(char * lineptr[],int nlines);
void writelines(char * lineptr[],int nlines);
void qsort(void *lineptr[],int left,int right,
int (*comp)(void *,void *));
int numcmp(const char *,const char *);
void swap(void * v[],int i ,int j );
int getline(char line[],int maxline);
/*对输入文本行进行排序*/
main(int argc,char * argv[])
{
int nlines;/*读入的输入行数*/
int numeric=0;/*若进行数值排序,则numeric的值为1*/
char oneline[1024];
if(argc>1&&strcmp(argv[1],"-n")==0)
numeric=1;
if((nlines=readlines(lineptr,MAXLINES))>=0)
{
qsort((void **)lineptr,0,nlines-1,
(int(*)(void *,void *))(numeric?numcmp:strcmp));
// (numeric ? (int(*)(void *,void *))numcmp : (int(*)(void *,void *))strcmp));
writelines(lineptr,nlines);
return 0;
}
else
{
printf("input too big to sort\n");
return 1;
}
}
/*qsort函数:以递增顺序对v[left]...v[right]进行排序*/
void qsort(void *v[],int left,int right,
int (*comp)(void *,void *))
{
int i,last;
if(left>=right)
return;
swap(v,left,(left+right)/2);
last=left;
for(i=left+1;i<right;i++)
if((*comp)(v,v[left])<0)
swap(v,++last,i);
swap(v,left,last);
qsort(v,left,last-1,comp);
qsort(v,last+1,right,comp);
}
/*numcmp函数:按数值比较字符串S1,S2的大小*/
int numcmp(const char *s1, const char *s2)
{
double v1,v2;
v1=atof(s1);
v2=atof(s2);
if(v1<v2)
return -1;
else if(v1>v2)
return 1;
else
return 0;
}
void swap(void *v[],int i ,int j)
{
void *temp;
temp=v;
v=v[j];
v[j]=temp;
}
/*readlines函数:读取输入行*/
int readlines(char * lineptr[],int maxlines)
{
int len,nlines;
char*p, line[MAXLEN];
nlines=0;
while((len=getline(line,MAXLEN))>0)
{
if(nlines>=maxlines)
return -1;
else
{
line[len-1]='\0';
strcpy(p,line);
lineptr[nlines++]=p;
}
}
return nlines;
}
int getline(char s[],int lim)
{
int c,i;
for(i=0;i<lim-1&&(c=getchar())!=EOF&&c!='\n';++i)
{
s=c;
}
if(c=='\n'){
s=c;
++i;
}
s='\0';
return i;
}
void writelines(char *lineptr[],int nlines)
{
while(nlines-->0)
{
printf("%s\n",*lineptr++);
}
} |
|