如何在不使用string.h库的C语言中实现字符串ASCII排序
如何用选择排序对C语言字符串数组按ASCII排序(不使用string.h)
错误原因分析
你原来的代码存在两个核心问题:
if(str[i] < str[j]):这里比较的是字符串指针的内存地址,而非字符串的实际内容,地址顺序和字符串的ASCII排序逻辑完全无关,属于逻辑错误。if(*str[i] < *str[j]):仅对比了两个字符串的第一个字符,无法处理首字符相同的字符串(比如"apple"和"apricot"),后续字符的差异会被忽略,导致排序结果不准确。
解决方案
因为禁止使用string.h,你可以自己实现字符串比较逻辑;如果允许使用stdlib.h,也可以直接调用其中的strcmp函数。
方案1:自定义字符串比较函数
实现一个逐字符比较的函数,模拟strcmp的功能,直到遇到不同字符或字符串结束,返回两个字符的ASCII差值:
int str_compare(const char *a, const char *b) { // 逐个字符对比,直到字符不同或字符串末尾 while (*a != '\0' && *b != '\0' && *a == *b) { a++; b++; } // 返回ASCII差值:正数表示a > b,负数表示a < b,0表示两字符串相等 return *a - *b; }
然后修改选择排序中的判断逻辑,用自定义函数替代指针/首字符比较:
// 升序排序:若str[k]的ASCII顺序大于str[j],更新k为j if (str_compare(str[k], str[j]) > 0) { k = j; }
完整示例代码:
#include <stdio.h> int str_compare(const char *a, const char *b) { while (*a != '\0' && *b != '\0' && *a == *b) { a++; b++; } return *a - *b; } void selection_sort(char **str, int n) { int i, j, k; char *temp; for (i = 0; i < n - 1; i++) { k = i; for (j = i + 1; j < n; j++) { if (str_compare(str[k], str[j]) > 0) { k = j; } } if (k != i) { temp = str[i]; str[i] = str[k]; str[k] = temp; } } } int main() { char *arr[] = {"banana", "apple", "cherry", "apricot"}; int len = sizeof(arr) / sizeof(arr[0]); selection_sort(arr, len); for (int i = 0; i < len; i++) { printf("%s\n", arr[i]); } return 0; }
方案2:使用stdlib.h的strcmp
如果允许引入stdlib.h,直接调用标准库的strcmp函数即可,修改判断条件为:
#include <stdlib.h> // ... 排序逻辑片段 ... if (strcmp(str[k], str[j]) > 0) { k = j; }
strcmp的返回值规则和自定义的str_compare完全一致,能正确对比整个字符串的ASCII顺序。
内容的提问来源于stack exchange,提问作者Katono
相关产品推荐
相关产品推荐

