这段代码目的是对文本行进行排序
但我在编译时 编译器警告12行声明 94行的strcpy有问题
#include <stdio.h.>
#include <string.h>
#include <stdlib.h>
#define MAXLINES 5000 /* 待排序的最大行数 */
char *lineptr[MAXLINES]; /* 指向文本行的指针 */
int readlines(char *lineptr[], int maxlines);
void writelines(char *lineptr[], int nlines);
void qsort(void *v[], int left, int right,
int (*comp)(void *, void *));
int numcmp(char *s1, char *s2);
void swap(void *v[], int i, int j);
char *alloc(int n);
int getline(char *s,int lim);
/* 对输入的文本行进行排序 */
main(int argc, char *argv[])
{
int nlines; /* 读入的输入行数 */
int numeric = 0; /* 若进行数值排序,则numeric的值为1*/
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));
writelines(lineptr, nlines);
return 0;
} else {
printf("input too big to sort\n");
return 1;
}
}
/* qsort函数:以递增顺序对v[align=left]…v[align=right]进行排序 */
void qsort(void *v[], int left, int right,int (*comp)(void *, void *))
{
int i, last;
void swap(void *v[], int, int);
if (left >= right) /* 如果数组元素个数小于2,则不执行任何操作 */
return;
swap(v, left, (left + right)/2);
last = left;
for (i = left+1; i <= right; i++)
if ((*comp)(v[i], v[align=left]) < 0)
swap(v, ++last, i);
swap(v, left, last);
qsort(v, left, last-1, comp);
qsort(v, last+1, right, comp);
}
int numcmp(char *s1, 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[i];
v[i] = v[j];
v[j] = temp;
}
#define MAXLEN 1000
/* 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 || (p = alloc(len)) == NULL)
return -1;
else {
line[len-1] = '\0'; /* 删除换行符 */
strcpy(p, line);
lineptr[nlines++] = p;
}
return nlines;
}
/* writelines 函数:写输入行 */
void writelines(char *lineptr[], int nlines)
{
while (nlines-- > 0)
printf("%s\n", *lineptr++);
}
#define ALLOCSIZE 10000 /* 可用的空间大小 */
static char allocbuf[ALLOCSIZE]; /* alloc使用的存储区 */
static char *allocp = allocbuf; /* 下一个空间位置 */
char *alloc(int n) /* 返回指向n个字符的指针 */
{
if (allocbuf + ALLOCSIZE - allocp >= n) { /* 有足够的空闲空间 */
allocp += n;
return allocp - n; /* 分配前的指针p */
} else /* 空闲空间不够 */
return 0;
}
/* getline函数:将一行读入到s中并返回其长度 */
int getline(char *s,int lim)
{
int c, i;
for (i=0;i<lim-1 && (c=getchar())!=EOF && c!='\n';++i)
s[i] = c;
if (c == '\n') {
s[i] = c;
++i;
}
s[i] = '\0';
return i;
}