求助:用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
相关产品推荐
相关产品推荐

