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

求助: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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.12 07:20:28