【问题标题】:Postfix calculator using words instead of operators使用单词而不是运算符的后缀计算器
【发布时间】:2021-01-08 19:03:37
【问题描述】:

我需要使用堆栈创建一个后缀计算器。用户将在其中用文字编写运算符。 喜欢:

  • 9.5 2.3 添加=

  • 5 3 5 细分 =

我的问题,我无法理解,我应该使用什么功能来扫描输入。因为它是数字、单词和字符 (=) 的混合体。

【问题讨论】:

  • 我建议使用scanf

标签: c


【解决方案1】:

你要做的基本上就是写一个解析器

首先,使用fgets 读取整行。然后使用strtok 获取以空格分隔的令牌。

然后,检查令牌是否为数字。你可以通过sscanf 做到这一点。如果转换为数字成功,请检查返回值。如果转换不成功,检查字符串是否等于“add”、“sub”、“="等。如果它不是数字或批准的操作之一,则生成错误。您不必区别对待长度为 1(又名 char)的字符串。

【讨论】:

    【解决方案2】:

    我的问题,我无法理解,我应该使用什么功能来扫描输入。因为它是数字、单词和字符 (=) 的混合体。

    但所有这些都由空格分隔。您可以基于此进行标记化,然后使用 strcmpstrtol 手动构建解析树,或者只需对标记的第一个字符进行比较(假设关键字不能以数字开头并且没有变量) .

    strtok(_r)。 “示例”部分解释了如何深入使用它,但作为没有错误处理和极端情况的摘录:

    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    #include <ctype.h>
    
    int main(void)
    {
        char eq[] = "5 3 5 sub div =";
        for (char *tok = strtok(eq, " "); tok != NULL; tok = strtok(NULL, " ")) {
            if (isdigit(tok[0]))
                printf("token-num: %s\n", tok);
            else if (tok[0] == '=')
                printf("token-eq: =\n");
            else
                printf("token-op: %s\n", tok);
        }
        return EXIT_SUCCESS;
    }
    

    【讨论】:

    • 谢谢。我会试试的!
    猜你喜欢
    • 1970-01-01
    • 2013-01-06
    • 2016-07-10
    • 2019-02-13
    • 1970-01-01
    • 1970-01-01
    • 2018-01-18
    • 2012-12-05
    • 2012-08-29
    相关资源
    最近更新 更多