C Primer Plus—字符串排序(C语言)

题目要求:输入的字符串按首字符大小排序
]代码如下。
选择排序:

#include
#include
#define SIZE 81
#define LIM 20
int main()
{
	char input[LIM][SIZE];
	char *ptstr[LIM];         //注意:是指针(代码块下方会有说明理由)
	int ct = 0;       //字符串组数
	int k;
	void stsrt(char *strings[],int num);    //声明编写的字符串排序函数
	char *s_gets(char *st,int n);   //声明修改后的输入函数
	
	while(ct < LIM && s_gets(input[ct],SIZE) != NULL && input[ct][0] != '\0')
	//while条件是数组下标不可超界,且输入不能是EOF,不能是空行
	{
		
		ptstr[ct] = input[ct];       //将输入的各字符串赋给指针变量
		ct++;
	}
	stsrt(ptstr,ct);    //调用字符串排序函数
	for(k = 0;k < ct;k++)
	{
		puts(ptstr[k]);   //输出排序后结果
	}
	return 0;
} 
void stsrt(char *strings[],int num)     //字符串排序函数 
{
	int top,seek;
	char *temp;
	for(top = 0;top < num - 1;top++)  
	//选择排序算法:此处实际上就是利用嵌套循环将首字符从小到大的字符串顺位排列
	{
		for(seek = top + 1;seek < num;seek++) 
		{
			if(strcmp(strings[top],strings[seek]) > 0)  
			 //若第一个参数ASCII码在第二个后面则返回正值,说明大的往后放
			{
				temp = strings[top];
				strings[top] = strings[seek];
				strings[seek] = temp;
			}
		}
	}
}
char *s_gets(char *st,int n)           //修改fgets后的输入函数
{
	char *ret_val;
	int i = 0;
	ret_val = fgets(st,n,stdin);
	if(ret_val)
	{
	 	while(st[i] != '\n' && st[i] != '\0')
	 		i++;
	 	if(st[i] == '\n')
	 		st[i] ='\0';
	 	else
	 	{
	 		while(getchar() != '\n')
	 			continue;
		 }
	}
	return ret_val;
}

值得注意的除了选择排序算法外,还有ptstr这个指针变量。可以发现,是将指针变量传入函数进行排序,而不是直接将字符串本身传入排序。输入的字符串赋给指针变量,如ptstr[0] = input[0],即ptstr[0]指向input[0]的首字符,ptstr依次传入函数进行选择排序,排序过程是重新排列ptstr,而没有改变input,如ptstr[0]从指向input[0]变为指向input[3]。

欢迎交流探讨。
谢谢。

你可能感兴趣的:(C)