You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在不使用string.h库的C语言中实现字符串ASCII排序

如何用选择排序对C语言字符串数组按ASCII排序(不使用string.h)

错误原因分析

你原来的代码存在两个核心问题:

  1. if(str[i] < str[j]):这里比较的是字符串指针的内存地址,而非字符串的实际内容,地址顺序和字符串的ASCII排序逻辑完全无关,属于逻辑错误。
  2. 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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.08 04:35:28