如何修正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。
错误原因
- 类型不匹配:用户输入的是字符串,但代码用
int类型栈存储,且用%d格式化输出,实际输出的是数组首地址的数值(随机数); - 指针与整数非法比较:
x是字符串数组(本质是指针),直接和整数-1比较,违反类型规则; - 输出对象错误:
printf中输出的是数组x本身(首地址),而非栈顶元素x[top]; - 返回值错误:函数声明为
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
相关产品推荐
相关产品推荐

