Turbo C++中缀转后缀代码第28行push参数类型不匹配错误求助
解决Turbo C++中push函数参数类型不匹配问题(中缀转后缀表达式)
你遇到的**Type mismatch in parameter 1 in call to 'push'**错误,核心原因是第28行的参数类型完全不兼容:
你的push函数声明是void push(int);,要求传入整数类型,但你写的是push("\0")——这里的"\0"是字符串字面量,类型是char*(字符指针),和int类型不匹配。Turbo C++这类老旧编译器对类型检查非常严格,所以直接抛出了错误。
第一步:修复类型不匹配问题
把第28行的push("\0")改成push('\0'):单引号包裹的'\0'是单个空字符,在Turbo C++中会被隐式转换为int类型(对应ASCII值0),完全符合push函数的参数要求。
另外要注意:你初始压入'\0'的逻辑存在问题——后续in2post函数末尾的while (top != -1)会把栈里所有元素(包括这个初始的'\0')都弹出并添加到后缀表达式里,导致输出的后缀表达式最后多一个空字符,可能引发后续计算错误。更合理的做法是直接去掉这行初始的push调用,因为你的栈已经用top = -1表示空栈状态了。
第二步:修复其他潜在问题(避免后续报错)
除了这个类型错误,你的代码还有几个会导致运行异常的问题,一起修正:
- cal函数的无限循环:
while (j < len)里没有j++,会一直停留在第一个字符,需要添加j++推进循环:while (j < len) { if (isdigit(post[j])) { x = post[j] - '0'; push(x); } else { m = pop(); n = pop(); switch (post[j]) { case '+': x = n + m; break; case '-': x = n - m; break; case '*': x = n * m; break; case '/': x = n / m; break; } push(x); } j++; // 新增这一行,让循环正常推进 } - scanf读取字符时的换行残留:在
scanf("%c", &a)之前,printf输出后会留下换行符,导致scanf直接读取到换行,改成带空格的格式符跳过空白:scanf(" %c", &a); - 重复的判断条件:
if (a == 'y' || a == 'y')里重复了小写y,应该改成:if (a == 'y' || a == 'Y') { - 缺少必要头文件:使用
isalnum、isdigit、strlen需要包含<ctype.h>和<string.h>,使用exit需要包含<stdlib.h>,在开头添加:#include <ctype.h> #include <string.h> #include <stdlib.h> - 后缀表达式加结束符:在
in2post函数中,收集完后缀表达式后添加post_exp[y] = '\0';,避免输出乱码。
修正后的核心代码片段
这里是修正后的in2post函数关键部分:
void in2post(char in_exp[]) { int x = 0, y = 0, z, result = 0; char a, c, post_exp[100]; char t; // 移除原有的push("\0") t = in_exp[x]; while (t != '\0') { if (isalnum(t)) { post_exp[y] = t; y++; } else if (t == '(') { push('('); } else if (t == ')') { while (stack[top] != '(') { c = pop(); post_exp[y] = c; y++; } c = pop(); } else { // 新增top != -1判断,避免栈空时访问stack[top] while (top != -1 && prec(stack[top]) >= prec(t)) { c = pop(); post_exp[y] = c; y++; } push(t); } x++; t = in_exp[x]; } while (top != -1) { c = pop(); post_exp[y] = c; y++; } post_exp[y] = '\0'; // 添加字符串结束符 printf("\nThe equivalent postfix expression is: %s", post_exp); // ... 后续代码 }
最后验证
把这些修改后,在Turbo C++里重新编译,应该就能解决类型不匹配的错误,同时避免后续运行时的异常。
内容的提问来源于stack exchange,提问作者Ansh Tyagi
相关产品推荐
相关产品推荐

