指針數組的應用
#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”從零開始計數。