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
相关产品推荐
相关产品推荐

