指针数组的应用
#include<stdio.h>
#include<string.h>
#define MAXLINES 5000
char *lineptr[MAXLINES];
char *linestor;
int readlines(char *lineptr[],int maxlines);
void writelines(char *lineptr[],int nlines);
void qsort(char *v[],int left,int right);
int main(){
int nlines;
if((nlines=readlines(lineptr,MAXLINES)) >= 0){
qsort(lineptr,0,nlines-1);
writelines(lineptr,nlines);
return 0;
}
else{
printf("error:input too big to sort\n");
return 1;
}
}
#define MAXLEN 1000
int getline(char *,int );
char *alloc(int);
int readlines(char *lineptr[],int maxlines){
int len,nlines;
char line[MAXLEN];
char *p;
nlines=0;
while((len=getline(line,MAXLEN))>0)
if(nlines >= maxlines || (p=alloc(len))==NULL)
return -1;
else{
line[len-1]='\0';//删除'\n'
strcpy(p,line);
lineptr[nlines++]=p;
}
return nlines;
}
void writelines(char *lineptr[],int nlines){
int i;
for(i=0;i<nlines;i++)
printf("%s\n",lineptr[i]);
}
void qsort(char *v[],int left,int right){
int i,last;
void swap(char *v[],int i,int j);
if(left>=right)
return;
last=left;
for(i=left+1;i<=right;i++)
if(strcmp(v[i],v[left])<0)
swap(v,++last,i);
swap(v,left,last);
qsort(v,left,last-1);
qsort(v,last+1,right);
}
void swap(char *v[],int i,int j){
char *temp;
temp=v[i];
v[i]=v[j];
v[j]=temp;
}
int getline(char *s,int lim){ //长度包含'\0'
int c;
char *t=s;
while(lim-->0 && (c=getchar())!=EOF && c!='\n')
*s++=c;
if(c=='\n')
*s++=c;
*s='\0';
return s-t;
}
#define ALLOCSIZE 10000
static char allocbuf[ALLOCSIZE];
static char *allocp=allocbuf; //allocp是外部变量!指向数组开头
char *alloc(int n){ //返回指向n个字符的指针
if(allocbuf+ALLOCSIZE-allocp>=n){
allocp += n;
return allocp-n;
}
else
return 0;
}
1 readlines部分如果换成练习题中用main函数提供一个数组,则实际运行会溢出,所以还是采用存储到调用alloc分配的存储空间中。
2 getline中获取的是每一行包括‘\0’的长度 比如“abc” 长度为4. 但实际上是“abc\n\0”从零开始计数。