0

私は C のコースを受講しており、古典的な Postfix 評価問題のプログラムを作成する必要があります。さて、私はすでにこの問題をJavaで完了しているので、スタックを使用して数値をプッシュし、演算子を取得したときにそれらをポップする必要があることを知っています。そのすべてで問題ないと思います。私が抱えていた問題は、Cで後置式をスキャンすることです。Javaでは、charAtを使用でき、parseIntコマンドを使用できるため、簡単でした。ただし、Cで同様のコマンドを認識していません。したがって、次の形式の文字列から各値を読み取る方法を誰かが説明できますか?

4 9 * 0 - =

等しいところは、入力の終わりの信号です。

どんな助けでも大歓迎です。事前に感謝します:)

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
}

それを行う方法は他にもたくさんあります。flexbison、またはantlrなどを使用したlexersparserについて読みたいと思うかもしれません。

于 2011-11-12T18:14:10.363 に答える