夜幕而已 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 使用C#,asp.net读取Excel文件并保存到Oracle数据库
  • ¥15 C# datagridview 单元格显示进度及值
  • ¥15 thinkphp6配合social login单点登录问题
  • ¥15 HFSS 中的 H 场图与 MATLAB 中绘制的 B1 场 部分对应不上
  • ¥15 如何在scanpy上做差异基因和通路富集?
  • ¥20 关于#硬件工程#的问题,请各位专家解答!
  • ¥15 关于#matlab#的问题:期望的系统闭环传递函数为G(s)=wn^2/s^2+2¢wn+wn^2阻尼系数¢=0.707,使系统具有较小的超调量
  • ¥15 FLUENT如何实现在堆积颗粒的上表面加载高斯热源
  • ¥30 截图中的mathematics程序转换成matlab
  • ¥15 动力学代码报错,维度不匹配