评估以字符串形式给出的算术表达式

时间:2014-02-15 12:32:22

标签: c string

我正在开发一个项目,我需要计算以字符串形式给出的算术表达式的值。

这就是我选择使用的方式是我运行字符串直到符号乘法。在此期间,我保留乘法字符串之前的数字。如果在这些数字之前有符号,我会重置字符串。最后,当我产生乘法符号时,我检查接下来会发生什么并保存到另一个字符串中。最后,我计算结果。依此类推,直到我解决练习(还有其他函数可以解决其余的方程式)。

我的问题是:除了乘法符号后面的数字没有保存在额外字符串中之外,乘法符号前面的数字不会重置会产生问题。

找到乘法符号并计算他的函数 -

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int main(void) {
    char str[10] = "3+1-4*6-7";
    char str1[10];
    char str2[10];
    int i, p = 0, k = 0;

    for(i = 0; i < 10; i++) {
        str1[k] = str[i];
        k++;
        if((str[k] == '-') | '+' | '/') {
            str1[0] = 0;
        }
        else if(str1[k] == '*') {
            while((str[i] != '-') | '+' | '*' | '/') {
                str2[p] = str[i];
                p++;
                i++;
            }
        }
    }
    printf("%s--%s\n", str1, str2);
}

感谢任何能帮助我解决问题的人 或者可以推荐另一种解决方法。

1 个答案:

答案 0 :(得分:1)

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

typedef struct exp {
    char op;
    char *term;
    struct exp *left;
    struct exp *right;
} Exp;

Exp *make_exp2(char *str){
    if(!str || !*str) return NULL;//*str == '\0' is format error.
    char *mul = strrchr(str, '*');
    char *div = strrchr(str, '/');
    Exp *node = malloc(sizeof(*node));
    if(mul == NULL && div == NULL){
        node->op = '\0';
        node->term = str;
        node->left = node->right = NULL;
        return node;
    }
    char *op;
    op = mul < div ? div : mul;
    node->op = *op;
    *op = '\0';
    node->left  = make_exp2(str );
    node->right = make_exp2(op+1);
    return node;
}

Exp *make_exp(char *str){
    if(!str || !*str) return NULL;//*str == '\0' is format error.
    char *minus = strrchr(str, '-');
    char *plus  = strrchr(str, '+');
    if(minus == NULL && plus == NULL)
        return make_exp2(str);
    char *op;
    Exp *node = malloc(sizeof(*node));
    op = minus < plus ? plus : minus;
    node->op = *op;
    *op = '\0';
    node->left  = make_exp(str );
    node->right = make_exp(op+1);
    return node;
}

#ifdef DEBUG

void print(Exp *exp, int level){
    int i;
    if(exp->op){
        for(i=0;i<level;++i)
            printf(" ");
        printf("%c\n", exp->op);
        for(i=0;i<level;++i)
            printf(" ");
        print(exp->right, level+1);
        printf("\n");
        for(i=0;i<level;++i)
            printf(" ");
        print(exp->left, level+1);
        printf("\n");
    } else {
        for(i=0;i<level;++i)
            printf(" ");
        printf("%s\n", exp->term);
    }
}

#endif

int main(void) {
    char str[] = "3+1-4*6-7";
    Exp *exp = make_exp(str);

#ifdef DEBUG
    print(exp, 0);
#endif
    //release exp
    return 0;
}