0

私の以前の質問はここにあります (この最も役立つコミュニティに、質問をスパム送信しようとしていないことを保証したいだけです):

C での後置式の評価

私の問題には、後置式の評価が含まれます。次のような後置式があるとします。

3 2 1 2 + ^ ^

値 (すべてのユーザーが文字列として入力したもの) をスタックに格納しようとしていますが、他の関数を使用して、最終結果がスタック内の唯一の残りの要素としてポップアウトされるように評価するつもりです。と提示しました。Code Blocks でデバッガーを数時間いじった後、関数がスタックに何も格納していないことがわかりました。さらに、関数を使用して、指している文字がオペランドであるかどうかを確認すると、オペランドであるにもかかわらず、取るべき適切なアクションが無視されます。isOperand 関数も含めて使用しているコードを次に示します。

bool isOperand(char *str)
{
    /** For value 3, str seems to be the entire character string
    being "3 2 1 2 + ^ ^" **/
    return isdigit(str) != 0;
}

int evaluatePostfix(char *postfixStr)
{
    stack * s;
    int x, y, z;

    stackInit(&s);

    while(postfixStr != NULL) {
        /** For the first value 3, it SHOULD be an operand and
        proceed to push it on the stack. But it just skips
        this condition. **/
        if(isOperand(postfixStr)) {
            stackPush(&s, postfixStr);
        }

        if(isOperator(postfixStr) == 1) {
            y = atoi(stackPop(&s));
            x = atoi(stackPop(&s));
            char *str = malloc(10 * sizeof(char));
            sprintf(str, "%d", applyOperator(x, y, postfixStr));
            stackPush(&s, str);
        }
        ++postfixStr;
    }

    z = stackPop(s);
    stackDestroy(&s);
    return z;
}

どうやらポインタの値を1つだけ送信する方法がわかりません。そして、それが 2 桁または 3 桁の場合、プログラムにそれを認識させるにはどうすればよいでしょうか? 繰り返しになりますが、お時間をいただきありがとうございます。人々が提供するすべての支援に感謝します。

****編集/解決策が見つかりました****

さて、私はまだ「新しいユーザー」であるため、自分の質問に答えることが許可されていないため、代わりに元の投稿を編集して、おそらく将来他の誰かに役立つようにします.

ここでは、トークン化が適切な状況であるように思われます。使用することで

strtok(文字列,区切り文字)

この関数は、文字列を空白文字のように見えるもので区切られた小さな文字列に分割します。文字列スペースの区切り文字 (別名 " ") を使用したためかどうかはまだ 100% わかりませんが、関係ありません。

でループを終了する

トークン = strtok(NULL, " ");

ポインターを 1 ずつインクリメントする代わりに、元の文字列を取得して直接変更しているように見えるため、元の文字列から完全に削除して小さな文字列部分をスタックにプッシュするのではなく、十分に機能します。良い習慣ではありませんが (代わりに、元の文字列のコピーを作成して入力の完全性を維持し、代わりにコピーを変更する必要があるため)、このプロジェクトの範囲ではうまくいくと思います。将来誰かに役立つかもしれない場合に備えて、私の発見を共有したかっただけです。また、私の使用説明で訂正すべき点があれば、ぜひ教えていただきたいです。

4

1 に答える 1

1

あなたはisdigitポインターを呼び出しています。

return isdigit(str) != 0;

それはポインティで呼び出されるべきです、

return isdigit(*str) != 0; // or, equivalently: return isdigit(*str);
于 2012-02-19T22:16:15.810 に答える