如何不使用内置函数对多个字符串进行字母排序?(学生作业)
不用内置函数对多个字符串进行字母排序的实现方法
嘿,我完全懂你在学校作业里的困扰——只比较首字符的思路确实太局限了,毕竟字符串排序得逐字符对比才能得到正确结果嘛!而且不能用内置函数的话,咱们可以自己实现核心的字符串比较逻辑,再搭配一个简单的排序算法(比如冒泡排序,对作业来说足够直观),就能搞定啦。
核心思路拆解
- 先实现一个自定义的字符串比较函数:不用
strcmp,自己逐个字符对比两个字符串,直到找到不同的字符,或者其中一个字符串结束(如果一个是另一个的前缀,那更短的字符串更小) - 把这个比较函数融入到基础排序算法里(比如冒泡排序),用来判断两个字符串是否需要交换位置
代码示例(C语言)
先写自定义的字符串比较函数:
// 自定义字符串比较函数:返回值>0表示str1>str2,<0表示str1<str2,=0表示相等 int compareStrings(char str1[], char str2[]) { int i = 0; // 逐个字符对比,直到遇到不同字符或其中一个字符串结束 while (str1[i] != '\0' && str2[i] != '\0') { if (str1[i] != str2[i]) { // 直接返回字符的ASCII差值 return str1[i] - str2[i]; } i++; } // 如果前面都相同,比较长度:短的字符串更小 return str1[i] - str2[i]; }
然后用冒泡排序来对字符串数组排序:
void sortStrings(char arr[][100], int count) { char temp[100]; // 临时字符串用于交换 for (int i = 0; i < count - 1; i++) { for (int j = 0; j < count - i - 1; j++) { // 用自定义的比较函数判断是否需要交换 if (compareStrings(arr[j], arr[j+1]) > 0) { // 手动交换两个字符串(不用内置的strcpy) int k = 0; while (arr[j][k] != '\0') { temp[k] = arr[j][k]; k++; } temp[k] = '\0'; k = 0; while (arr[j+1][k] != '\0') { arr[j][k] = arr[j+1][k]; k++; } arr[j][k] = '\0'; k = 0; while (temp[k] != '\0') { arr[j+1][k] = temp[k]; k++; } arr[j+1][k] = '\0'; } } } }
最后是测试的主函数:
#include <stdio.h> // 上面的compareStrings和sortStrings函数放在这里 int main() { char strings[5][100] = {"banana", "apple", "cherry", "date", "blueberry"}; int num = 5; printf("排序前的字符串:\n"); for (int i = 0; i < num; i++) { printf("%s\n", strings[i]); } sortStrings(strings, num); printf("\n排序后的字符串:\n"); for (int i = 0; i < num; i++) { printf("%s\n", strings[i]); } return 0; }
关键细节说明
- 字符串比较的时候,一定要逐字符对比,不能只看首字符——比如"apple"和"apricot",首两个字符都相同,得比到第三个字符才能分出大小
- 交换字符串的时候,我们也手动实现了复制逻辑,完全不用内置的
strcpy,符合作业要求 - 冒泡排序虽然效率不是最高,但胜在逻辑简单,容易理解和手写,非常适合学校作业的场景
内容的提问来源于stack exchange,提问作者Fihii
相关产品推荐
相关产品推荐

