0
#include "cstack.h"
#include <iostream>
#include <cstring>
using namespace std;

bool isValidExpression (CStack&, char*);

int main (void)
{
    char expression[21];
    expression[0-21]=0;
    cout<< "Enter an expression: ";
    cin >>expression;
    CStack stack1;

    if (isValidExpression (stack1, expression)==true)
    {
        cout << "\nIt's a valid expression";
    }
    else
    {
        cout << "\nIt's NOT a valid expression";
    }
    return 0;
}

bool isValidExpression (CStack& stackA, char* strExp)
{
    for(int a=0;a<21 && strExp[a]!=0;a++)
    {
        if(strExp[a]="}"||"]"||")") //This is the issue right here
        {
            cout<<"Action A" <<endl;
        }
        else
        {
            stackA.push(strExp[a]);
        }
    }
    return true;
}

私が抱えている問題は、入力した内容が何であれ、アクション A が常に発生することです。たとえば [ を入力しても、望ましい結果ではないアクション a が得られます。このようなことには常に文字列を使用してきましたが、このプログラムでは cstring を使用する必要があります。これを機能させるには、どのように編集しますか?

4

2 に答える 2

3

更新してみてください:

if(strExp[a]="}"||"]"||")")

に:

if(strExp[a]=='}'|| strExp[a]==']'|| strExp[a]==')' )
于 2013-03-14T02:23:54.343 に答える
3

if(strExp[a]="}"||"]"||")")"]"これはand")"を演算子のブール値として使用し||、文字列定数自体は と見なされるゼロ以外const char *の s に解決されるため、常に true になりますtrue。さらに、単一=は比較ではなく代入です。これは、if条件の 3 つの部分すべてがtrue

上記の条件は次のようになります。

if (生成されたポインタの下位8ビットが"}"[true]
または生成されたポインタ"]"が非ゼロである[true]
または生成されたポインタ")"が非ゼロである[true])

あなたがしようとしていることは

if(strExp[a]=='}' || strExp[a]==']' || strExp[a]==')')

ここでは、二重引用符が一重引用符に置き換えられていることにも注意してください。単一の文字を調べるときは、二重引用符ではなく単一引用符を使用してください。==比較用にもどうぞ。

でコンパイルしているg++場合は、で警告を有効にする必要があります。正常g++ -Wall -Wextraなコンパイラは、記載されているすべての理由でその行に警告を生成します。

于 2013-03-14T02:24:07.440 に答える