```c
#include <stdio.h>
#include <string.h>
#define SIZE 81
#define LIM 20
#define HALT " "
void strsort(char *strings[], int num);
char *s_gets(char *s, int n);
int main()
{
char input[LIM][SIZE]; //用于存输入的字符串数组
char *ptstr[LIM]; //内含指针变量的数组
int count = 0;
printf("Input up to %d lines, and I will sort them.\n", LIM);
printf("To stop, press the Enter key at a line's start.\n");
while (count < LIM && s_gets(input[count], SIZE) != NULL && input[count][0] != '\0')
{
ptstr[count] = input[count]; //第count个指针指向第count个字符串
count++;
}
strsort(ptstr, count); //第一个参数为字符串数组
puts("\nHere are the sorted list:\n");
for (int i = 0; i < count; i++)
{
puts(ptstr[i]);
}
return 0;
}
/*字符串排序算法(以数字排序为例,从小到大排序)
序号 数字(第1轮)
0 9 首先序号为0位置的数和下面的所有数字挨个比较,小的放在序号0位置,这一轮比较后,所有数字中最小的会放在0位置
1 0 第2轮将序号1位置上的数和下面所有数字挨个比较,小的放在序号1位置上,这一轮比较后,除序号0位置的数字,其余数字中最小(所有数字中倒数第2小)的数字会放在1位置
2 3 第3轮将序号2位置行的数字·········································································倒数第3小的数字会放在2位置上
3 4
4 1
5 8
6 5
7 3
8 4
*/
void strsort(char *strings[], int num) //argu1是一个数组,里面是指向string的指针
//通过改变指针的指向,来进行排序,strings[0]指向最小的,最靠前的
{
char *temp; //做个中转站的作用
int top, seek; //定义最大值索引和种子索引
for (top = 0; top < num - 1; top++)
{
for (seek = top + 1; seek < num; seek++)
{
if (strcmp(strings[top], strings[seek]) > 0) //strings[top]指向ASCII码更小的
{
temp = strings[top];
strings[top] = strings[seek]; //挨个比较
strings[seek] = temp; //strings[seek]指向ASCII码较大的,之后再来下一个进行比较,谁小谁放在top
}
}
}
}
char *s_gets(char *s, int n)
{
char *ret_val;
int i = 0;
ret_val = fgets(s, n, stdin); //fgets正常情况下返回的地址与第一个输入参数相同
if (ret_val != NULL)
{
while (s[i] != '\n' && s[i] != '\0')
{
i++;
}
if (s[i] == '\n')
{
s[i] = '\0';
}
else
{
while (getchar() != '\n')
{
continue;
}
}
}
return ret_val;
}
下面是程序输出,先手动输入一组字母—>回车—>得到排序后的结果
Input up to 20 lines, and I will sort them.
To stop, press the Enter key at a line's start.
apple
zipple
like
hello
disk
bank
english
Here are the sorted list:
apple
bank
disk
english
hello
like
zipple