夜幕而已 2019-05-22 18:14 采纳率: 0%
浏览 331

C语言 函数的形参传递问题(代码内容是表达式求值,数组栈实现)

例如输入2+3 形参a应该是#,b应该是+。把b打印在屏幕上 b确实是+,但是进入switch的b却是'/n'换行符,也有可能是getnext函数里输入没吞掉回车的问题。但是如果没吞掉回车,形参b和ch应该都是换行符,但是打印出来却是+不。知道为什么会这样,求大佬解答,如果有解决方案就更好了,谢谢各位。

#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#include<ctype.h>
int num[100];
char str[1000];
char judge(char a, char b) {
  //printf("%c",b);
    int i, j;
    char pre[][7] = {
        /*运算符之间的优先级制作成一张表格*/
            {'>','>','<','<','<','>','>'},
            {'>','>','<','<','<','>','>'},
            {'>','>','>','>','<','>','>'},
            {'>','>','>','>','<','>','>'},
            {'<','<','<','<','<','=','0'},
            {'>','>','>','>','0','>','>'},
            {'<','<','<','<','<','0','='} };
    switch (a) {
    case '+': i = 0; break;
    case '-': i = 1; break;
    case '*': i = 2; break;
    case '/': i = 3; break;
    case '(': i = 4; break;
    case ')': i = 5; break;
    case '#': i = 6; break;
    }
    switch (b) {
    case '+': j = 0; break;
    case '-': j = 1; break;
    case '*': j = 2; break;
    case '/': j = 3; break;
    case '(': j = 4; break;
    case ')': j = 5; break;
    case '#': j = 6; break;
    }
    return pre[i][j];
}

int Operate(int a, char theta, int b) {
    int i, j, result;
    i = a;
    j = b;

    switch (theta) {
    case '+': result = i + j; break;
    case '-': result = i - j; break;
    case '*': result = i * j; break;
    case '/': result = i / j; break;
    }
    return result;
}

int getnext(int *n) {
    char c;
    *n = 0;
    while ((c = getchar()) == ' ');  
    if (!isdigit(c)) {      
        *n = c;
        return 1;
    }
    do {                      
        *n = *n * 10 + (c - '0');       
        c = getchar();
    } while (isdigit(c));       
    ungetc(c, stdin);           
    return 0;
}
int main()
{
    int i = 0, j = 0;
    char ch, c, x;
    str[j] = '#';
    j++;
    int a, b, flag=-1;
    str[j] = '#';
    j++;
    flag = getnext(&ch);
    x = str[j - 1];
    while (ch != '='|| x != '#')//str[j-1]是字符栈栈顶
    {
        if (flag == 0) {
            num[i] = ch;
            i++;
            flag = getnext(&ch);
        }
        else
        {
            //printf("%c", ch);
            switch (judge(str[j-1], ch))//问题出处
            {
            case '<'://栈顶元素优先级低                    
                num[i] = ch; i++;
                flag = getnext(&ch);
                break;
            case '='://脱括号并接受下一字符 
                j--;
                flag = getnext(&ch);
                break;
            case '>':// 退栈并将运算结果入栈                                       
                c = str[j - 1]; j--;
                b = num[i - 1]; i--;
                a = num[i - 1]; i--;
                    num[i]=Operate(a, c, b); i++;
                    break;
            }
        }
        x = str[j - 1];
    }
    c = num[i - 1];
    printf("%d", c);
}
  • 写回答

1条回答 默认 最新

  • CSDN-Ada助手 CSDN-AI 官方账号 2022-09-09 16:21
    关注
    不知道你这个问题是否已经解决, 如果还没有解决的话:

    如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 以帮助更多的人 ^-^
    评论

报告相同问题?

悬赏问题

  • ¥15 lammps拉伸应力应变曲线分析
  • ¥15 C++ 头文件/宏冲突问题解决
  • ¥15 用comsol模拟大气湍流通过底部加热(温度不同)的腔体
  • ¥50 安卓adb backup备份子用户应用数据失败
  • ¥20 有人能用聚类分析帮我分析一下文本内容嘛
  • ¥15 请问Lammps做复合材料拉伸模拟,应力应变曲线问题
  • ¥30 python代码,帮调试
  • ¥15 #MATLAB仿真#车辆换道路径规划
  • ¥15 java 操作 elasticsearch 8.1 实现 索引的重建
  • ¥15 数据可视化Python