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

C语言命令行RPN计算器运算符数组首元素异常问题求助

解决RPN计算器运算符数组首元素乱码问题

嘿,这明显是未初始化数组+索引偏移错误导致的内存垃圾值问题!我帮你拆解下问题根源和修复方案:

问题1:运算符数组索引偏移错误

看你添加运算符的循环:

for(int c = operands + 1; c < argc; c++) {
    // ...
    operators[c - operands] = b;
}

当c第一次取operands + 1时,c - operands的结果是1——这意味着你把第一个运算符放到了数组的索引1位置,而索引0的位置完全没被赋值,留在那里的就是内存里的随机垃圾值(也就是你看到的º)。

问题2:打印循环越界

再看你的打印代码:

for(int count = 0; count <= TotalOps; count++) {
    printf("%c ", operators[count]);
}

如果TotalOps是运算符的总数(比如你例子里的4),用<=会让循环多执行一次,打印出索引4的元素——这又是一个未赋值的内存垃圾值。

额外潜在问题:运算符判断逻辑可能反转

你的Is_Op函数如果是返回1表示是合法运算符,那当前代码里if(Is_Op(b) == 1)就会把合法运算符判定为错误,这完全反了!


修复后的代码片段

  1. 修正运算符数组索引 + 修复判断逻辑:
// 假设Is_Op返回1表示是合法运算符,0表示不是
for(int c = operands + 1; c < argc; c++) {
    char b = *argv[c];
    if(Is_Op(b) == 0) { // 修正判断逻辑:不是运算符才报错
        fprintf(stderr, "%c is not an operator\n", b);
        return 1;
    } else {
        operators[c - operands - 1] = b; // 索引减1,从0开始赋值
    }
}
  1. 修正打印循环条件:
for(int count = 0; count < TotalOps; count++) { // 用<代替<=,避免越界
    printf("%c ", operators[count]);
}
  1. 额外建议:初始化运算符数组
    为了彻底避免内存垃圾值问题,声明数组时最好初始化:
#define MAX_OPERATORS 100 // 根据你的需求定义最大值
char operators[MAX_OPERATORS] = {0}; // 未赋值的位置会被初始化为0

这样修复后,你的运算符数组就能正确存储{+, +, +, +},打印出来也不会有乱码了。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.12 04:31:21