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

字符串冒泡排序代码异常:移除printf后无输出及排序错误排查

字符串冒泡排序的问题排查与修复

遇到的问题

  • 移除bubblesort函数内注释的printf语句后,程序输入完成后无任何输出
  • 保留该printf语句时,排序结果为降序,不符合预期的升序要求

原代码

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

void bubblesort(int n, char *ptr[]){
    char *tmp;
    for (int i = 0; i < n; i++){    
        for (int j = 0 ; j < n; j++){
            if(strcmp(*(ptr+i) , *(ptr+j))>0){
                strcpy(tmp , *(ptr+i));
                strcpy(*(ptr+i) , *(ptr+j));
                strcpy(*(ptr+j) , tmp);
            }
        }
    }
    //printf("",ptr+0,ptr+1,ptr+2,ptr+3,ptr+4,ptr+5,ptr+6,ptr+7,ptr+8,ptr+9); <= without this line my code doesn't executive
}

int main()
{
    int n;
    scanf("%d\n", &n);
    char str[10][20];
    for (int i = 0; i < n; i++)
        gets(str[i]);
    char *ptr[10];
    for (int i = 0; i < n; i++)
        ptr[i] = str[i];
    bubblesort(n, ptr);
    for (int i = 0; i < n; i++)
        puts(ptr[i]);
}

运行结果

保留printf语句时

C:\Users\kk\Desktop\C>a
10
banana
kiwi
apple
tomato
lemon
melon
pear
blueberry
strawberry
orange

tomato
strawberry
pear
orange
melon
lemon
kiwi
blueberry
banana
apple

C:\Users\kk\Desktop\C>

移除printf语句时

C:\Users\kk\Desktop\C>a
10
banana
kiwi
apple
tomato
lemon
melon
pear
blueberry
strawberry
orange

C:\Users\kk\Desktop\C>

错误原因分析

  1. 无输出的核心原因:未初始化指针tmp
    tmp是未初始化的char*指针,没有指向有效内存空间。直接用strcpy(tmp, ...)会往随机内存地址写入数据,触发未定义行为——保留printf时只是巧合让程序没立即崩溃,移除后内存错误直接导致程序提前终止,因此无输出。

  2. 排序降序的原因:冒泡排序逻辑错误

    • 双重循环范围错误:j从0遍历到n-1,会重复比较已排好的元素,且每次把更大的元素交换到前面,最终形成降序。
    • 比较逻辑问题:正确的升序冒泡排序应该让相邻元素比较,把大元素逐步“冒”到后面,而非全局比较所有元素对。
  3. 额外输入问题

    • scanf("%d\n", &n)中的\n会让scanf持续等待非空白字符,导致输入流程异常;
    • gets函数不安全,易造成缓冲区溢出,需替换为更安全的输入函数。

修复后的代码

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

void bubblesort(int n, char *ptr[]){
    // 直接交换指针,避免字符串拷贝的内存风险,同时提升效率
    char *tmp;
    for (int i = 0; i < n - 1; i++){    
        // 每轮循环后,最后i个元素已是最大值,无需再比较
        for (int j = 0 ; j < n - i - 1; j++){
            // strcmp返回>0表示ptr[j] > ptr[j+1],交换后实现升序
            if(strcmp(ptr[j], ptr[j+1]) > 0){
                tmp = ptr[j];
                ptr[j] = ptr[j+1];
                ptr[j+1] = tmp;
            }
        }
    }
}

int main()
{
    int n;
    // 去掉格式串中的\n,避免输入阻塞
    scanf("%d", &n);
    // 吃掉scanf留下的换行符,防止fgets读取空行
    getchar();
    
    char str[10][20];
    for (int i = 0; i < n; i++){
        // 用fgets替代gets,同时截断换行符
        fgets(str[i], sizeof(str[i]), stdin);
        str[strcspn(str[i], "\n")] = '\0';
    }
    
    char *ptr[10];
    for (int i = 0; i < n; i++)
        ptr[i] = str[i];
    
    bubblesort(n, ptr);
    
    for (int i = 0; i < n; i++)
        puts(ptr[i]);
}

修复说明

  • 指针交换替代字符串拷贝:彻底避免未初始化指针的内存风险,同时提升排序效率;
  • 排序逻辑修正:调整循环范围为j < n - i - 1,仅比较相邻元素,通过strcmp判断实现升序;
  • 输入问题修复:移除scanf的\n,用getchar()处理残留换行,替换gets为fgets并截断换行符,避免输入异常。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.06 05:45:21