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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.11 07:27:45