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

如何修正C语言数组实现栈的Peek操作错误?

数组栈Peek函数错误修正

问题

用数组实现栈的Peek函数时遇到两个问题:

  • 调用Peek本该显示用户输入的栈顶字符串,却输出随机数;
  • 代码中if(x != -1)处触发「指针与整数比较」的编译警告。

原Peek函数代码:

int peek()
{
    if(top == -1)
    {
        printf("\n \t STACK UNDERFLOW");
        return -1;
    }
    else
    {
        if(x != -1)
            printf("\n The top most element is %d",x);
        return x[top];
    }
}

操作场景:用户入栈字符串Jennie、Lisa后调用Peek,输出The top most element is 4229504,期望输出The top most element is Lisa。

错误原因

  1. 类型不匹配:用户输入的是字符串,但代码用int类型栈存储,且用%d格式化输出,实际输出的是数组首地址的数值(随机数);
  2. 指针与整数非法比较:x是字符串数组(本质是指针),直接和整数-1比较,违反类型规则;
  3. 输出对象错误:printf中输出的是数组x本身(首地址),而非栈顶元素x[top];
  4. 返回值错误:函数声明为int,但实际要返回字符串,类型矛盾。

修正代码及说明

完整修正示例

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

// 定义栈的容量和字符串最大长度
#define STACK_CAPACITY 10
#define MAX_STR_LEN 20

// 字符串栈数组,top跟踪栈顶索引
char stack[STACK_CAPACITY][MAX_STR_LEN];
int top = -1;

// 入栈函数:安全存储字符串
void push(const char* str) {
    if (top == STACK_CAPACITY - 1) {
        printf("\n\tSTACK OVERFLOW");
        return;
    }
    top++;
    // 拷贝字符串并手动添加终止符,避免越界
    strncpy(stack[top], str, MAX_STR_LEN - 1);
    stack[top][MAX_STR_LEN - 1] = '\0';
}

// 修正后的Peek函数
void peek() {
    if (top == -1) {
        printf("\n\tSTACK UNDERFLOW");
        return;
    }
    // 用%s格式化输出栈顶字符串
    printf("\n The top most element is %s", stack[top]);
}

关键修改点

  • 调整栈存储类型:将栈改为字符串数组char stack[STACK_CAPACITY][MAX_STR_LEN],适配用户输入的字符串类型;
  • 移除非法比较:删掉if(x != -1)判断,消除指针与整数比较的警告;
  • 修正输出逻辑:用%s格式化输出,直接访问栈顶元素stack[top];
  • 修正函数返回值:将Peek改为void类型(若需返回字符串,可返回const char*,但需注意栈内存的生命周期);
  • 补充安全入栈逻辑:使用strncpy确保字符串不会越界,手动添加终止符避免乱码。

验证效果

入栈Jennie、Lisa后调用Peek,将输出:

The top most element is Lisa

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.12 06:55:25