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

C语言实现按单词ASCII总和降序的冒泡排序失效,如何解决?

问题排查与修复方案

1. 交换函数swap实现逻辑完全错误

你需要交换的是两个char*类型的字符串指针,原代码的交换逻辑没有修改传入指针的实际指向,是排序不生效的核心原因。
修复后的swap函数:

void swap(char **xp, char **yp)
{
    char *temp = *xp; 
    *xp = *yp;
    *yp = temp;
}

2. 排序规则不符合需求,误用strcmp

strcmp是按字典序逐字符比较,和你需要的「ASCII码总和降序」规则完全无关,需要先实现计算字符串ASCII总和的工具函数,再修改排序判断逻辑:

// 计算字符串所有字符ASCII码总和
int calc_ascii_sum(char *str) {
    int sum = 0;
    while(*str != '\0') {
        sum += (int)*str;
        str++;
    }
    return sum;
}

// 修改后的冒泡排序逻辑,实现总和降序
void bubbleSort(char **arr, int n)
{
   int i, j;
   for (i = 0; i < n-1; i++)                
       for (j = 0; j < n-i-1; j++)
           // 前一个元素总和小于后一个就交换,保证大的在前
           if (calc_ascii_sum(arr[j]) < calc_ascii_sum(arr[j+1]))
              swap(&arr[j], &arr[j+1]);
}

3. 输出遍历逻辑存在隐含风险

原代码依赖数组剩余未初始化元素为NULL终止遍历,属于巧合情况,建议按实际元素个数遍历更稳妥:

for(int i=0; i<3; i++) {
    printf("\nthe words are : %s", p[i]);
}

完整可运行代码

#include<stdio.h>
#include<string.h>

int calc_ascii_sum(char *str) {
    int sum = 0;
    while(*str != '\0') {
        sum += (int)*str;
        str++;
    }
    return sum;
}

void swap(char **xp, char **yp)
{
    char *temp = *xp; 
    *xp = *yp;
    *yp = temp;
}
 
void bubbleSort(char **arr, int n)
{
   int i, j;
   for (i = 0; i < n-1; i++)                
       for (j = 0; j < n-i-1; j++)
           if (calc_ascii_sum(arr[j]) < calc_ascii_sum(arr[j+1]))
              swap(&arr[j], &arr[j+1]);
}

int main ()
{
    char *p[3]={"Manolas","tikinio","youssef el arabi"};
    
    bubbleSort(p,3);
    
    for(int i=0; i<3; i++)
    {
        printf("\nthe words are : %s", p[i]);
    }
    
    return 0;
}

内容的提问来源于stack exchange,提问作者Βill97

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.18 14:24:07