您的位置:首页 > 编程语言 > C语言/C++

对文本中的字符串进行排序(C语言)

2014-09-01 15:30 459 查看
对文本中的字符串进行排序,文本中一行一个字符串。
#include <stdio.h>
#include <string.h>

#define Limt 100               /*一行文本的最大长度*/
#define Maxlen 10000
#define Maxline 1000

char string[Maxlen];           /* 存放所有的字符串*/
char *linesp[Maxline];         /* 指针数组,每一个元素如 linesp[i] 存放string[]中不同字符串的首地址*/

int getline(char s[], int max);
void str_order( char *v[], int n);
void writelines(char *v[], int n);
void swap(char *a, char *b);
int readlines(char *linesp[], int max);

int main()
{
int nlines;                    /*字符串的总的个数(行数)*/
if((nlines = readlines(linesp,Maxline)) <= 0) {
printf("Error");
}
else {
str_order(linesp, nlines);
writelines(linesp, nlines);
}
return 0;
}

/******* 函数的功能*******/
/**读入一行文本(包括'\n')到s[]中,最后以'\0'结束,返回字符串的长度'\n'也算在内**/
/**若文本长度超过s[]的最大长度则丢弃超过的长度,s[]最后以'\0'结束,返回长度max-1(即'\0'所在的位置)**/

int getline(char s[], int max)
{
int i, c;
for(i=0; i< max-1 && (c = getchar()) != EOF && c != '\n'; i++)
s[i] = c;
if(c == '\n')
s[i++] = c;
s[i] = '\0';
return i;
}

/***  将字符串数组 t 复制到 字符串数组m 中  ***/

void strcpy( char *s, char *t)
{
while(*s++ = *t++);
}

/***将文本行存放在 string[Maxlen] 中,返回文本的行数 ***/
/*** linesp[Maxline] 每一个元素如 linesp[i] 为string[]中不同字符串的首地址 **/
int readlines(char *linesp[], int max)
{
char s[Limt];                  /* 存放临时读入的一行字符串*/
int len;                       /* 一行文本的长度 */
int nlines = 0;
char *p = string;      //&&
while( (len = getline(s,Limt)) > 0 ) {
if( nlines >= Maxline || (Maxline + string - p) < 0 ) {
return -1;
}
else {
s[len-1] = '\0';
strcpy( p, s);
linesp[nlines++] = p;
p = p + len;
}
}
return nlines;
}

/***比较字符串的大小***/
int strcmp(char *s, char *t)
{
int i=0;
while(*s == *t)
if(*s == '\0')
return 0;
return *s - *t;
}

 /***   交换两个地址用数组的方法交换 v[]的首地址给形参,
**实参和形参指向同一段内存,在函数中改变形参,实参也随之改变

 void swap(char *v[], int i, int j)
{
<span style="white-space:pre">	</span> char *temp=0;
temp = v[i];
<span style="white-space:pre">	</span> v[i] = v[j];
<span style="white-space:pre">	</span> v[j] = temp;
} */
/***   交换两个地址  ***/
/***  传递给函数的的是字符串地址的地址:swap(&v[j-1],&v[j]),*a 即*&v[j-1]还是一个指针,指向一个地址***/
void swap(char **a, char **b)
{
char *temp=0;
temp = *a;
*a = *b;
*b = temp;
}

/**** 最字符串数组进行排序 ****/

void str_order( char *v[], int n)
{
int i, j;
for(i=n;i>0;i--)
for(j=i;j>0;j--) {
if( strcmp( v[j-1], v[j] )>0 )
swap(&v[j-1],&v[j]);
}
}

/****将字符行按顺序输出****/
void writelines(char *v[], int n)
{
int i;
for(i=0; i < n; i++)
printf("%s\n",v[i]);
getchar();
}
互相学习,共同进步。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  c 指针