0

我正在学习 C 语言课程,我们必须为经典的 Postfix 评估问题编写一个程序。现在,我已经在 java 中完成了这个问题,所以我知道我们必须使用堆栈将数字压入,然后当我们得到一个运算符时弹出它们,我想我对所有这些都很好。我遇到的问题是扫描 C 中的后缀表达式。在 java 中它更容易,因为您可以使用 charAt 并且可以使用 parseInt 命令。但是,我不知道 C 中有任何类似的命令。所以任何人都可以解释一种从字符串中读取每个值的方法,格式如下:

4 9 * 0 - =

其中equals是输入端的信号。

任何帮助将不胜感激,并在此先感谢您:)

4

3 回答 3

1

假设您输入的是一个字符数组。

char input[] = "4 9 * 0 - =";

您可以通过访问每个单独的数组元素来访问单个字符

if (input[4] == '*') /* deal with star */;

或者您可以使用指针算法并从输入中的不同点解析(请记住#include <stdio.h>`sscanf´ 的原型)

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 */
于 2011-11-12T17:35:40.463 回答
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
}
于 2011-11-12T17:35:45.660 回答
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
}

还有很多方法可以做到这一点。您可能想阅读有关词法分析器和解析器的信息,例如使用flexbisonantlr等。

于 2011-11-12T18:14:10.363 回答