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)就会把合法运算符判定为错误,这完全反了!
修复后的代码片段
- 修正运算符数组索引 + 修复判断逻辑:
// 假设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开始赋值 } }
- 修正打印循环条件:
for(int count = 0; count < TotalOps; count++) { // 用<代替<=,避免越界 printf("%c ", operators[count]); }
- 额外建议:初始化运算符数组
为了彻底避免内存垃圾值问题,声明数组时最好初始化:
#define MAX_OPERATORS 100 // 根据你的需求定义最大值 char operators[MAX_OPERATORS] = {0}; // 未赋值的位置会被初始化为0
这样修复后,你的运算符数组就能正确存储{+, +, +, +},打印出来也不会有乱码了。
内容的提问来源于stack exchange,提问作者Oliver Thurston
相关产品推荐
相关产品推荐

