【发布时间】:2021-01-08 19:03:37
【问题描述】:
我需要使用堆栈创建一个后缀计算器。用户将在其中用文字编写运算符。 喜欢:
- 9.5 2.3 添加=
或
- 5 3 5 细分 =
我的问题,我无法理解,我应该使用什么功能来扫描输入。因为它是数字、单词和字符 (=) 的混合体。
【问题讨论】:
-
我建议使用scanf。
标签: c
我需要使用堆栈创建一个后缀计算器。用户将在其中用文字编写运算符。 喜欢:
或
我的问题,我无法理解,我应该使用什么功能来扫描输入。因为它是数字、单词和字符 (=) 的混合体。
【问题讨论】:
标签: c
你要做的基本上就是写一个解析器。
首先,使用fgets 读取整行。然后使用strtok 获取以空格分隔的令牌。
然后,检查令牌是否为数字。你可以通过sscanf 做到这一点。如果转换为数字成功,请检查返回值。如果转换不成功,检查字符串是否等于“add”、“sub”、“="等。如果它不是数字或批准的操作之一,则生成错误。您不必区别对待长度为 1(又名 char)的字符串。
【讨论】:
我的问题,我无法理解,我应该使用什么功能来扫描输入。因为它是数字、单词和字符 (=) 的混合体。
但所有这些都由空格分隔。您可以基于此进行标记化,然后使用 strcmp 和 strtol 手动构建解析树,或者只需对标记的第一个字符进行比较(假设关键字不能以数字开头并且没有变量) .
见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;
}
【讨论】: