首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >解析中间有两个操作数和一个运算符的简单数学方程

解析中间有两个操作数和一个运算符的简单数学方程
EN

Stack Overflow用户
提问于 2016-11-20 19:35:09
回答 1查看 63关注 0票数 0

我只需要处理下面的方程式。

9-8

5222/12

322*445

7878+7

但是,当我输入8+9作为inpurt时。控制台只显示8.000000+,它似乎没有处理最后一个操作数。

我请客我没有正确地拥有这个分支else if(isOperator(*endTemp))

有什么想法吗?或者方向?

代码语言:javascript
运行
复制
static double getUserInputValues() {
    double values[NUM_OF_USER_INPUT_VALUES];
    while (1) {
        errno = 0;
        char temp[257];
        char operator;
        fgets(temp, 256, stdin);
        char *str = strtok(temp, " ");

        int cnt = 0;
        while (str != NULL && cnt < NUM_OF_USER_INPUT_VALUES) {
            char *endTemp;
            double val = strtod(str, &endTemp);
            printf("%f", val);
            if (*endTemp == 0 || *endTemp == '\n') {
                values[cnt] = val;
                cnt++;
                str = strtok(NULL, " ");
            } else if(isOperator(*endTemp)){
                operator = *endTemp;
                printf("%c", operator);
                str = strtok(NULL, " ");
            }
            else {
                errno = 1;
                break;
            }
        }
    }
    return getReturnValue(values, operator);;
}


static bool isOperator(char ch){
    switch(ch){
        case '+':
            return 1;
        case '-':
            return 1;
        case '*':
            return 1;
        case '/':
            return 1;
        default:
            return 0;
    }
}
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-11-20 19:52:18

在开始之前,我强烈建议您学习如何使用调试器,因为这类事情正是它们存在的原因。知道如何有效地调试一个问题,是程序员工具包中不可或缺的工具。

无论如何,strtod将尝试从字符串中解析浮点数,将其未解析的其余部分放在第二个参数中给出的指针中。

strtok会将字符串分解成令牌。在您的示例中,您使用一个空格进行分隔,因此从输入“8+9”中获得的第一个标记将是"8+9",因为这个输入中没有空格。

然后,对strtod的调用将解析此令牌中的8,将字符串"+9“的其余部分存储在endTemp中。

您只是在您的代码中提取操作符,然后继续丢弃剩余的内容并接受下一个令牌。

代码语言:javascript
运行
复制
operator = *endTemp; // endTemp == "+9" at this point
                     // so *endTemp == '+'.
printf("%c", operator);
str = strtok(NULL, " "); // discard current token (9 is not handled).

如您所见,您没有处理剩余的号码。

一个简单的解决方法如下:

代码语言:javascript
运行
复制
operator = *endTemp; // endTemp == "+9" at this point
                     // so *endTemp == '+'.
printf("%c", operator);
str = endTemp + 1;   // str == "9" now.
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/40708504

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档