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

C语言实现字符串栈问题:display功能无法正常运行求助

字符串栈代码修复方案

原代码的核心问题

  1. 未为栈中字符串分配内存:栈结构体里的char *stack[100]是指针数组,但每个指针未指向有效内存空间,直接赋值会引发野指针错误,导致display功能无法正常工作。
  2. 字符串复制逻辑错误:push函数中*(s->stack[s->top])=element;写法错误,且循环条件的'/0'是拼写错误,应为'\0'。
  3. 局部变量生命周期问题:element是push函数的局部数组,函数执行完毕后内存会被释放,栈指针指向它会导致后续访问失效。
  4. 输出格式问题:printf字符串中的换行应使用\n而非直接换行,避免编译警告或输出异常。

修复后的完整代码

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

#define max 5
struct stack{
    int top;
    char *stack[100];
};
typedef struct stack stack;

void push(struct stack *s)
{
    char element[20];
    if (s->top == max-1)
    {
        printf("栈已满\n");
        return;
    }
    else
    {
        s->top += 1;
        printf("请输入要入栈的元素\n");
        scanf("%s", element);
        // 为当前栈元素分配内存,长度为字符串长度+1(存储终止符)
        s->stack[s->top] = (char*)malloc(strlen(element) + 1);
        if (s->stack[s->top] == NULL) {
            printf("内存分配失败\n");
            s->top -= 1; // 恢复top,避免栈状态错误
            return;
        }
        // 复制字符串到分配的内存中
        strcpy(s->stack[s->top], element);
    }
}

void pop(struct stack *s)
{
    if (s->top == -1)
    {
        printf("栈为空\n");
        return;
    }
    else
    {
        printf("被删除的元素是:%s\n", s->stack[s->top]);
        free(s->stack[s->top]); // 释放字符串占用的内存,避免内存泄漏
        s->top -= 1;
    }
}

void display(struct stack *s)
{
    if (s->top == -1)
    {
        printf("栈为空\n");
        return;
    }
    else
    {
        printf("元素如下:\n");
        for (int i = 0; i <= s->top; i++)
        {
            printf("%s\n", s->stack[i]);
        }
    }
}

int main()
{
    struct stack s;
    s.top = -1;
    int ch;
    for(;;)
    {
        printf("请输入你的选择\n");
        printf("1.入栈\n");
        printf("2.出栈\n");
        printf("3.显示\n");
        printf("4.退出\n");
        scanf("%d", &ch);
        switch (ch)
        {
            case 1:
                push(&s);
                break;
            case 2:
                pop(&s);
                break;
            case 3:
                display(&s);
                break;
            case 4:
                // 退出前释放所有栈中元素的内存
                while (s.top != -1) {
                    free(s->stack[s.top]);
                    s.top--;
                }
                goto a;
                break;
            default:
                printf("无效选择\n");
                break;
        }
    }
a:
    return 0;
}

修复点说明

  • 添加#include <string.h>用于调用字符串操作函数strlen和strcpy。
  • push函数中为每个栈元素分配独立内存,确保字符串数据不会随局部变量销毁而丢失。
  • pop函数中释放出栈元素的内存,避免内存泄漏。
  • main函数退出前释放所有剩余栈元素的内存,保证内存安全。
  • 所有提示文本改为中文,输出格式统一使用\n换行。

预期终端输出示例

请输入你的选择
1.入栈
2.出栈
3.显示
4.退出
1
请输入要入栈的元素
john
请输入你的选择
1.入栈
2.出栈
3.显示
4.退出
1
请输入要入栈的元素
maddy
请输入你的选择
1.入栈
2.出栈
3.显示
4.退出
3
元素如下:
john
maddy

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.04 05:05:36