与之前的相比可能更好一点,当然也可能更糟糕,希望不会误导观众。
#include <stdio.h>
void print_str_array(char** str_array){
while(*str_array)
printf("%s\t", *str_array++);
printf("\n");
}
void str_copy(char** s_d, char ** s_s){
while(*s_s){
*s_d++ = *s_s++;
}
*s_d = NULL;
}
void str_swap(char** s0, char** s1) {
char* tmp[1];
*tmp = *s1;
*s1 = *s0;
*s0 = *tmp;
}
int str_size(char* str) {
int len = 0;
while(*str++) {
len++;
}
return len;
}
int str_array_size(char** str_array){
int len = 0;
while(*str_array++)
len++;
return len;
}
char str_cmp(char* c0, char* c1) {
//比较字符串,不论长度等否,首先按字符顺序ASCII码值大小,只要等位置
//的值小,字符串就小。如果到短字符串的结尾两个字符串中字符都相等,则
//短字符串小,否则字符串相等。
char* tmp;
if((str_size(c0) < str_size(c1))) {
tmp = c0;
} else {
tmp = c1;
}
while( *tmp && (*c0 == *c1)) {
c0++;
c1++;
tmp++;
}
if(!*tmp) {
if(!*c0 && *c1) {
printf("<");
return '<';
}
else if(*c0 && !*c1) {
printf(">");
return '>';
}
else
return '=';
} else {
if(*c0 > *c1) {
return '>';
} else {
return '<';
}
}
}
void str_sort(char** str_array){
char** tmp = str_array + 1;
char** mytmp = str_array;
int i;
for(i = 0; i < str_array_size(mytmp) - 1; mytmp++) {
tmp = mytmp + 1;
while(*tmp) {
if(str_size(*mytmp) > str_size(*tmp))
str_swap(mytmp, tmp);
tmp++;
}
}
}
void str_sort1(char** str_array){
char** tmp = str_array + 1;
char** mytmp = str_array;
int i;
for(i = 0; i < str_array_size(mytmp) - 1; mytmp++) {
tmp = mytmp + 1;
while(*tmp) {
if(str_cmp(*mytmp, *tmp) == '>')
str_swap(mytmp, tmp);
tmp++;
}
}
}
int main(void) {
char* str_array[] = {"A0001", "X02", "e3", "88888888", "aa", "b", "Dee",
"@@@@@@@@@@@@@", NULL};
char* str_array1[0xff];
str_copy(str_array1, str_array);
print_str_array(str_array);
str_sort(str_array);
printf("按字符串长度排序:\n");
print_str_array(str_array);
printf("……………………………………………………………………………………………\n\n");
print_str_array(str_array1);
str_sort1(str_array1);
printf("按ASCII码值排序:\n");
print_str_array(str_array1);
}
/*
C:\Users\Administrator>gcc -o test202.exe test202.c
C:\Users\Administrator>test202
A0001 X02 e3 88888888 aa b Dee @@@@@@@@@@@@@
按字符串长度排序:
b aa e3 X02 Dee A0001 88888888 @@@@@@@@@@@@@
……………………………………………………………………………………………
A0001 X02 e3 88888888 aa b Dee @@@@@@@@@@@@@
按ASCII码值排序:
88888888 @@@@@@@@@@@@@ A0001 Dee X02 aa b e3
*/