当前位置: 代码迷 >> C语言 >> [求助]对文本进行排序
  详细解决方案

[求助]对文本进行排序

热度:393   发布时间:2006-11-28 17:52:30.0
[求助]对文本进行排序

这段代码目的是对文本行进行排序
但我在编译时 编译器警告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;
}

搜索更多相关的解决方案: 文本  int  void  char  include  

----------------解决方案--------------------------------------------------------
strcmp后面没有什么
----------------解决方案--------------------------------------------------------

strcmp在头文件 <string.h>里没有吗?

需要在下面具体写出函数吗?


----------------解决方案--------------------------------------------------------
像这样形式strcmp(argv[1], "-n")
----------------解决方案--------------------------------------------------------


int strcmp(char *s, char *t)
{
for ( ; *s == *t; s++,t++)
if (*s == '\0')
return 0;
return *s - *t;
}

是这样定义吗


----------------解决方案--------------------------------------------------------
这个问题太复杂了!!!!!!!!!!!!
往往一个“,“就可以让你的程序变样。
我没那个耐性搞!!!!!!!!
你自己在编译器里慢慢搞吧!!!!!!!!!
----------------解决方案--------------------------------------------------------
  相关解决方案