/*
* 1、字符串由大小写字母、数字以及空格组成,一个或多个空格将多个字符串隔开
* 2、解析出各字符串
* 3、输出结果时,将得出的个子串按照长度从大到小排序,如果长度一样,按照小写字母>大写字母>数字,进行排序
* 4、输出结果时,一个空格隔离各个子串
* 比如w23r at 1rt Af w13r, 排序后为 w13r 1rt at Af
*/
#include
#include
#define N 1024
/*
* 定义一个结构体,保存解析出来的数据和字符串
*/
struct strNum
{
int num;
char strSub[26];
};
/*
* 功能:解析出子串,并统计子串中字符数的数目
* 保存子串
*/
int getSubstring(char a[], struct strNum Oupstr[], int k)
{
int len, i;
int j = 0; /* j 为结构体里面数组下标的变化量, k 为结构体数组的变化量 */
int spaceNum = 0; /* spaceNum 为隔开字符用的空格数 */
len = strlen(a);
k = 0;
for( i = 0; i < len; i++)
{
if(a[i] != ' ')
{
Oupstr[k].strSub[j] = a[i];
Oupstr[k].num++;
j++;
spaceNum = 0;
}
else if ( a[i] == ' ' && spaceNum == 0)
{
k++;
spaceNum++;
j = 0;
}
}
return k;
}
/*
* 功能:对解析出来的子串进行长度排序
*/
void sortSubstring(struct strNum Oupstr[], int SubNum)
{
int i, j;
struct strNum tmp;
for( i = 0; i < SubNum; i++ )
{
for( j = i + 1; j < SubNum; j++)
{
if(Oupstr[i].num < Oupstr[j].num ) /* 根据字符数进行排序 */
{
tmp = Oupstr[i];
Oupstr[i] = Oupstr[j];
Oupstr[j] = tmp;
}
}
}
}
/*
* 功能:对长度已经排好序的子串进行符号排序
* 如果这两个子串的字符数相等,那么对字符进行比较!
* 对于同类别的字符,按照从小到大的顺序排序;
* 对于不同类别的字符,按照从大到小的顺序排序
*/
void sort( struct strNum Oupstr[], int SubNum )
{
int i, j, t;
struct strNum tmp;
for( i = 0; i < SubNum; i++ )
{
for(j = i +1; j < SubNum; j++)
{
if( Oupstr[i].num == Oupstr[j].num )
{
for( t = 0; t < Oupstr[i].num; t++ )
{
if ( ( Oupstr[i].strSub[t] >= 'a' && Oupstr[i].strSub[t] <= 'z' ) &&
( Oupstr[j].strSub[t] >= 'a' && Oupstr[j].strSub[t] <= 'z' ) )/* 如果字符不同,同类别的交换 */
{
if(Oupstr[i].strSub[t] > Oupstr[j].strSub[t])
{
tmp = Oupstr[i];
Oupstr[i] = Oupstr[j];
Oupstr[j] = tmp;
break;
}
else break;
}
else if( (Oupstr[i].strSub[t] >= 'A' && Oupstr[i].strSub[t] <= 'Z') &&
(Oupstr[j].strSub[t] >= 'A' && Oupstr[j].strSub[t] <= 'Z')) /* 如果字符不同,同类别的交换 */
{
if(Oupstr[i].strSub[t] > Oupstr[j].strSub[t])
{
tmp = Oupstr[i];
Oupstr[i] = Oupstr[j];
Oupstr[j] = tmp;
break;
}
else break;
}
else if( ( Oupstr[i].strSub[t] >= '0' && Oupstr[i].strSub[t] <= '9')&&
( Oupstr[j].strSub[t] >= '0' && Oupstr[j].strSub[t] <= '9' )) /* 如果字符不同,同类别的交换 */
{
if(Oupstr[i].strSub[t] > Oupstr[j].strSub[t])
{
tmp = Oupstr[i];
Oupstr[i] = Oupstr[j];
Oupstr[j] = tmp;
break;
}
else break;
}
else if( Oupstr[i].strSub[t] < Oupstr[j].strSub[t] )/* 如果字符不同,不同类别的交换 */
{
tmp = Oupstr[i];
Oupstr[i] = Oupstr[j];
Oupstr[j] = tmp;
break;
}
}
}
}
}
}
int main(void)
{
char strInput[N];
struct strNum Outputstr[256];
int i, j, Num = 0;
/*
* 结构体数组初始化
*/
for( i = 0; i < 256; i++)
{
for( j = 0; j < 26; j++)
{
Outputstr[i].num = 0;
Outputstr[i].strSub[j] = 0;
}
}
gets(strInput);
Num = getSubstring(strInput, Outputstr, Num);
sortSubstring(Outputstr,Num +1);
sort(Outputstr,Num +1);
for( i = 0; i < Num + 1; i++)
{
printf("%s ", (Outputstr[i].strSub));
}
return 0;
}
编码水平比较低!我相信有更好的办法,欢迎交流!