求助:C语言使用strcmp实现字符串冒泡排序函数异常问题
问题排查与修复
核心问题
你的sort函数中,if判断语句未用花括号包裹完整的交换逻辑,导致仅第一条strcpy受条件控制,后续两条strcpy会无条件执行,直接破坏了冒泡排序的交换逻辑。
错误分析
原代码的关键错误片段:
if(strcmp(a[j], a[j + 1]) > 0) strcpy(temp , a[j]); strcpy(a[j] , a[j + 1]); strcpy(a[j + 1], temp);
在C语言中,if语句默认仅管辖紧随其后的单条语句。上述代码等价于:
if(strcmp(a[j], a[j + 1]) > 0) { strcpy(temp , a[j]); } // 以下两行不受if条件约束,每次循环都会执行 strcpy(a[j] , a[j + 1]); strcpy(a[j + 1], temp);
这会导致:即使不需要交换(strcmp返回≤0),程序也会把a[j+1]的值覆盖到a[j],再将temp(可能是随机残留值)覆盖到a[j+1],最终出现dog man man这类错误结果。只有当数组完全逆序时,每次if条件都成立,三条语句按顺序执行,才会“碰巧”得到正确结果。
修复后的代码
给if的交换逻辑添加花括号,确保三条strcpy都受条件控制:
#include<stdio.h> #include<string.h> void print(char a[][10], int size); void sort(char a[][10], int size); int main(){ int n; scanf("%d", &n); char a[n][10]; int i; for (i = 0; i < n; i++){ scanf("%s", a[i]); } print(a, n); sort(a, n); print(a, n); } void print(char a[][10], int size){ int i; printf("\n"); for(i = 0; i < size; i++){ printf("%s", a[i]); printf("\n"); } } void sort(char a[][10], int size){ int i, j; char temp[10]; for(i = 0; i < size; i++){ for(j = 0; j < size - i - 1; j++){ if(strcmp(a[j], a[j + 1]) > 0) { strcpy(temp , a[j]); strcpy(a[j] , a[j + 1]); strcpy(a[j + 1], temp); } } } }
验证结果
输入3 man car dog后,修复后的代码输出:
man car dog car dog man
完全符合预期。
内容的提问来源于stack exchange,提问作者Nectar
相关产品推荐
相关产品推荐

