2013-03-14 2 views
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; 
} 

문제점은 내가 입력 한 모든 것이 항상 발생한다는 것입니다. [예를 들어, 나는 여전히 원하는 결과가 아닌 액션을 얻습니다. 나는 항상 이런 식으로 문자열을 사용했지만 우리는이 프로그램에서 cstring을 사용해야합니다. 이 기능을 편집하려면 어떻게 편집합니까?참조로 전달 된 C 문자열에 대한 입력 유효성 검사

답변

3

봅니다 업데이트 :

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

에 :

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

if(strExp[a]="}"||"]"||")")이이 || 사업자에 대한 논리 값으로 "]"")"를 사용하고, 문자열 자체가 해결 상수 때문에 항상 true가됩니다 0이 아닌 const char *이 있으며, 이는 true으로 간주됩니다. 또한, 단일 =이 할당하지 비교, 이것은 if 상태의 세 부분 true

상기 조건이 판독 의미 그대로 :

"}" 위해 생성 된 포인터 (하위 8 비트 [참이면 ]
또는 "]"에 대해 생성 된 포인터가
또는 ")"에 대해 생성 된 포인터가 [사실]) 나는 당신이 할 말은 무슨 생각을

입니다 제로 이외] [제로가 아닌 사실이다

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

또한 따옴표 여기에 작은 따옴표로 대체되어 있습니다. 큰 따옴표가 아닌 단일 문자를 검사 할 때는 작은 따옴표를 사용하십시오. 또한 비교를 위해 ==을 사용하십시오.

g++으로 컴파일하는 경우 g++ -Wall -Wextra과 함께 경고를 활성화해야합니다. 모든 정상적인 컴파일러는 명시된 모든 이유로 경고를 생성합니다.

+0

'==', not = ''. 참조로 전달 된 이후로 문자열을 편집 할뿐입니다. – lcs

+0

woops, 좋은 캐치 –