我正在参加C课程,我们必须为经典的Postfix评估问题制作一个程序。现在,我已经在java中完成了这个问题,所以我知道我们必须使用堆栈将数字推入,然后在我们得到一个运算符时弹出它们,我想我对所有这些东西都很好。我遇到的问题是在C中扫描后缀表达式。在java中它更容易,因为你可以使用charAt,你可以使用parseInt命令。但是,我不知道C中有任何类似的命令。所以任何人都可以解释一种方法来从表单中读取每个值:
4 9 * 0 - =
其中equals是输入结束的信号。
非常感谢任何帮助,并提前感谢您:)
答案 0 :(得分:1)
假设你输入的是一个字符数组。
char input[] = "4 9 * 0 - =";
您可以通过访问每个单独的数组元素来访问单个字符
if (input[4] == '*') /* deal with star */;
或者您可以使用指针算法并从输入中的不同点进行解析(请记住{sscanf'的原型#include <stdio.h>
)
if (sscanf(input + 2, "%d", &number) != 1) /* deal with error */;
或者,正如Chris Lutz在评论中所建议的那样,使用strtol
(在适当的#include <stdlib.h>
之后)
number = strtol(input + 2, &next, 10);
/* don't forget to check for errors! */
/* `next` now points to the character after the `long` at position 2 in the array */
答案 1 :(得分:0)
C字符串是字符数组:char[]
或char*
。
你可以使用for循环来迭代它并通过它的索引得到每个字符:
for (int i = 0; i < strlen(yourString); i++)
{
char ch = yourString[i];
// ...
}
此外,还有一个函数strtok()
可能有助于对字符串进行标记:
#include <string.h>
#define NULL (void*)0
char yourString[] = "4 9 * 0 - =";
char delimiters[] = " "; // could be " +*/-=" depending on your implementation
char *token = NULL;
token = strtok(yourString, delimiters);
while(token != NULL)
{
printf("current token is: %s\n", token);
// do what ever you want with the token
token = strtok(NULL, delimiters); // next token
}
答案 2 :(得分:0)
您还可以通过sscanf
知道已读取了多少项(读取数据项的计数器是sscanf
的结果)以及相对位置是什么(使用%n
格式说明符)。
所以你也可以编码
int pos = 0;
int endpos = 0;
int val = 0;
if (sscanf(input + pos, "%d %n", &val, &endpos) >= 1) {
// val has been read as an integer, handle it
stack[top++] = val;
pos += endpos; // skip to next token in input
}
还有很多方法可以做到这一点。您可能希望阅读有关lexers和parsers的信息,例如:使用flex和bison,或antlr等