- 论坛徽章:
- 0
|
K&R第5。5节的一段程序是个unix中函数sort的简化版本,就是对输入文本排序:
#include <stdio.h>
#include <string.h>
#define MAXLINES 5000
char *lineptr[MAXLINES];
int readlines (char *lineptr[], int nlines);
void writelines(char *lineptr[], int nlines);
void qsort(char *lineptr[], int left, int right);
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 *p, line[MAXLEN];
nlines = 0;
while ((len = getline(line, MAXLEN)) > 0)
if (nlines >- maxlines || (p = alloc(len)) == NULL)
return -1;
else {
line[len-1] = '\0';
strcpy(p, line);
lineptr[nlines++] = p;
}
return nlines;
}
void writelines(char *lineptr[], int nlines)
{
while (nlines-- > 0)
printf("%s\n", *lineptr++);
}
还有一个qsort函数省略了,就是快速排序
这段代码这段代码中关于指针数组lineptr,有个问题,就是在writelines中用到了*lineptr++也就是将数组名当作指针来用了,虽然它是个指针数组但lineptr也是数组名阿,在5.3中又说过数组名不是变量,虽然它表示一个地址但不能对其赋值和作lineptr++这样的运算,那这样说不是这两处矛盾了吗??请教高手指教!!谢谢!!! |
|