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

求助:用C语言栈合并字符串并按ASCII降序排序,输出异常

代码问题排查:栈结构实现ASCII降序排序异常

问题场景

尝试用C语言栈结构对命令行传入的字符串(如im loving)按ASCII码降序合并排序,期望输出vonmliig,但实际输出m i。

核心错误点

  • push函数内存分配与索引逻辑错误
    初始stackindex设为0,第二次push时,++stackindex先将索引变为1,随后realloc仅分配1 * sizeof(char)的空间,导致访问stack[1]时内存越界。同时栈顶索引初始值不合理,空栈状态下应设为-1,push时先自增索引再赋值,避免空栈时的索引混乱。

  • 排序逻辑完全失效
    main函数中的排序循环for (j = i; j < k; j++)范围错误:i是命令行参数的索引(从1开始),k是当前参数的长度,未覆盖整个栈的所有字符;排序条件stack[i] > stack[j]是升序逻辑,与需求的降序相反;且排序仅在单个参数处理后执行,未对所有入栈字符做整体排序。

  • main函数代码结构错误
    处理第一个命令行参数后,直接调用show()并return 0,导致后续参数(如loving)完全未被处理。show()和return 0的位置错误,应放在外层循环结束之后。

  • 无效的空格插入逻辑
    if (i, argc-1)是逗号表达式,实际判断结果为argc-1,只要传入参数个数大于1,就会多次插入空格,导致栈中混入多余空格。

修正后的代码

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

char *stack;
int stack_top = -1; // 空栈时栈顶索引为-1

// 入栈函数
int push(char in) {
    // 首次分配或扩容
    if (stack_top == -1) {
        stack = (char *)malloc(sizeof(char));
    } else {
        stack = (char *)realloc(stack, sizeof(char) * (stack_top + 2)); // 扩容到当前元素数+1
    }
    if (!stack) { // 内存分配失败判断
        perror("Memory allocation failed");
        return 0;
    }
    stack[++stack_top] = in;
    return 1;
}

// 出栈函数
char pop() {
    if (stack_top == -1) {
        return '\0'; // 空栈返回空字符
    }
    return stack[stack_top--];
}

// 对栈内元素进行降序排序(冒泡排序示例)
void sort_stack() {
    if (stack_top <= 0) return;
    for (int i = 0; i <= stack_top; i++) {
        for (int j = i + 1; j <= stack_top; j++) {
            if (stack[i] < stack[j]) { // 降序:交换较小的到后面
                char temp = stack[i];
                stack[i] = stack[j];
                stack[j] = temp;
            }
        }
    }
}

// 输出栈内所有元素
void show() {
    // 先排序再输出
    sort_stack();
    while (stack_top != -1) {
        printf("%c", pop());
    }
    printf("\n");
}

int main(int argc, char** argv) {
    if (argc < 2) {
        printf("Usage: %s <string1> [string2] ...\n", argv[0]);
        return 1;
    }

    // 将所有命令行参数的字符入栈
    for (int i = 1; i < argc; i++) {
        int len = strlen(argv[i]);
        for (int j = 0; j < len; j++) {
            push(argv[i][j]);
        }
        // 如果不是最后一个参数,插入空格(可选,根据需求调整)
        if (i != argc - 1) {
            push(' ');
        }
    }

    show();

    // 释放内存
    free(stack);
    return 0;
}

说明

  • 修正栈索引逻辑,用stack_top表示栈顶元素索引,空栈时为-1,入栈先自增索引再赋值。
  • 新增sort_stack函数对整个栈内元素做降序冒泡排序,确保所有字符按ASCII码从高到低排列。
  • 调整main函数结构,先将所有参数字符入栈再执行排序输出,保证所有字符被处理。
  • 修复空格插入逻辑,仅在非最后一个参数后插入空格(不需要可删除此部分)。
  • 增加内存分配失败的错误处理,程序结束时释放栈内存避免泄漏。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.15 14:30:41