c - C语言中的递归字符串计算器

标签 c string recursion calculator

我正在用 C 语言制作一个字符串计算器,但我遇到了一些问题。

例如:2 * (123-321) * (2+(3-4)-(3*2*2))/((12-2)/(1+1+1+1) +0+ 1))

应该打印2178,但它却打印3058704

所以我尝试计算 (2+(3-4)-(3*2*2)) 并发现它返回 77578153 而不是 -11
而且 2*(123-321)*(1-12)/2 返回 1980 而不是 2178

#include <stdio.h>
#include <stdlib.h>
char *vnos;

int charToDigit(int i1, int i2) {
    int stevilo = 0;
    int i;
    //printf("%d  %d\n",i1,i2);
   // printf("%c %d\n",vnos[i1], vnos[i1]);
    for(i=i1; i<=i2; i++)
        //printf("%d  ", (vnos[i1]-48));
         stevilo = (stevilo + (vnos[i] - '0'))*10;
    stevilo = stevilo/10;
    return stevilo;
}

int rekurzija(int zacetek, int konec) {
     //printf("bumbum: %d %d \n", zacetek, konec);
    int i,oklepaj1,zaklepaj1,oklepaj,zaklepaj;
    int zacasniI=0;
    i=zacetek;

    if(vnos[zacetek] == '(' && vnos[konec] == ')'){
        oklepaj = 1;
        zaklepaj = 0;
        i++;
        while(!oklepaj == zaklepaj) {
            if (vnos[i] == '(')
                oklepaj++;
            if (vnos[i] == ')')
                zaklepaj++;
            i++;
        }
        i--;
        if(i==konec){
            return rekurzija(zacetek+1,konec-1);
        }
    }


    for(i=zacetek; i<=konec; i++){
           // printf("tralala: %d %d \n", zacetek, konec);
        switch(vnos[i]){
            case '+':
                return rekurzija(zacetek,(i-1))+rekurzija((i+1),konec);
            case '-':
                if(i>zacasniI)
                    zacasniI = i;
                break;
            case '*':
                if(zacasniI==0)
                    zacasniI = i;
                break;
            case '/':
                if(zacasniI==0 || vnos[zacasniI]=='/')
                    zacasniI = i;
                break;
            case '(':
                oklepaj1 = 1;
                zaklepaj1 = 0;
                i++;
                while(!oklepaj1 == zaklepaj1) {
                if (vnos[i] == '(')
                    oklepaj1++;
                if (vnos[i] == ')')
                    zaklepaj1++;
                i++;
                }
                i--;
                break;
        }

    }
    if(zacasniI>0){
        switch(vnos[zacasniI]) {
        case '-': return rekurzija(zacetek, zacasniI-1)-rekurzija(zacasniI+1, konec);
        case '*': return rekurzija(zacetek, zacasniI-1)*rekurzija(zacasniI+1, konec);
        case '/': return rekurzija(zacetek, zacasniI-1)/rekurzija(zacasniI+1, konec);
        }
    }

    return charToDigit(zacetek,konec);

}

int main(){
    vnos = malloc(sizeof(char) * 9000);
    char r;
    int z = 0;
    int l;
    scanf("%c", &r);
    while(r != '\n'){
        if(r != ' '){
            vnos[z] = r;
            z++;
        }
        scanf("%c", &r);
    }
    int result = rekurzija(0,z-1);
    printf("%d\n", result);
    return 0;
}

vnos = input
zacetek = start
konec = end
stevilo = number
oklepaj = right parenthesis
zaklepaj = left parenthesis
zacasni = temporary

如有任何帮助,我们将不胜感激。

最佳答案

当输入中有多层括号时,似乎会出现您的问题。

(2+(3-4)-(3*2*2)) --> fail

2+(3-4)-(3*2*2) --> -11  correct

这一行看起来很可疑:

            while(!oklepaj1 == zaklepaj1) {

! 的优先级高于 == 所以你可能的意思是:

            while(!(oklepaj1 == zaklepaj1)) {

我尝试了一下,当输入有多层括号时仍然无法正确计算,因此与括号相关的bug较多。

编辑:

我发现了括号中剩下的问题。当遇到括号时,您将括号中的整个表达式发送到 charToDigit。相反,您应该将一组括号内的内容发送到 rekurzija

此外,您正在使用整数除法,因此任何余数都会被删除。这就是 1/2*2 给出 0 的原因。

关于c - C语言中的递归字符串计算器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30527156/

相关文章:

C通过指针将多个int数组存储到另一个数组中

c - C中的Escape键无限循环

c++ - 所有子串的频率

python - 使用正则表达式提取字符串位置Python

PHP - 多维数组递归

java - 在Java中递归传递计数器变量

c - C 中的嵌套结构

c++ - 在 C++ 中将字节字符串拆分为 BYTES vector

java - 如何将我的 While 循环重写为递归?

指针和整数之间的比较