2012-05-07 5 views
4

に文字列内の文字間の比較:は、私は次のことを持って指定されたchar

int findPar(char* str) 
{ 
int counter=0; 

while (*str) 
{ 
    if(str[0] == "(") <---- Warning 
    { 
     counter++; 
    } 
    else if (str[0]== ")") <---- Warning 
    { 
     counter--; 
    } 
    if (counter<0) 
    { 
     return 0; 
    } 
    str++; 
} 

if (counter!=0) 
{ 
    return 0; 
} 
return 1; 
} 

私が手に警告がint型とchar型との比較です。

私はこのようにstrcmpでも比較(指定されたchar対文字列の最初の文字)を実行しようとしました:

if (strcmp(str, ")")==0) { stuff } 

が、場合でも、比較は(はず)それは「もの」にして行くことはありません正しい。

どうすればよいですか?

+1

一重引用符を使用してください。 '"))==)\ 0 '文字通り、' ')' ==) 'です。 – chris

+0

'strcmp(str、 ')')== 0)'は、文字列全体char *を1つのリテラル文字と比較しているため動作しません。 'strcmp(str [0]、 ')')== 0'と思っています。 – EdChum

+0

@EdChum 'strcmp'は、パラメータが文字列であると想定しています。 ')'の場合、値41の文字は '(char *)41'に変換されます。したがって、関数はメモリアドレス '41'を調べ、文字列を参照してBAMを参照します。 Segfault。 – Imp

答えて

12

strがC文字列(ヌルで終わる文字の配列)の場合、str[0]はcharです。

引用符の種類が重要であることに注意してください。 ')'は文字ですが、")"は文字列です(つまり、ヌルターミネータが後に続く')'文字)。

だから、あなたは2つの文字と比較してもよい:

str[0] == ')' 

か、二つの文字列

自然
strcmp(str, ")") == 0 

、(str文字列は、本当にそれだけで括弧が含まれている場合は、2番目の作品)を比較することができるが。

2

二重引用符、"は文字列区切り文字なので、")"if(str[0] == "(")の文字列リテラルへのポインタです。 あなたが文字に比較したいので、あなたがconst char[N]"whatever")と単一引用符

if(str[0] == '(') 
4

あなたは文字(str[0])を比較しているを使用する必要があります。単一引用符は、単一の文字を表すのに対し、あなたは、二重引用符は、文字配列を示しているため、単一引用符を使用する必要があります。

if (str[0] == ')') // or *str == ')' 

いくつかの時点で、文字列中に、あるためstrcmpは同様に失敗した理由でした)を指している場合、それ以上の文字があります(つまり、直後には'\0'が付いていません)。文字列は、文字が1つの文字列")"と等価ではありません。

1

あなたはif (str[0] == ')')などが必要です。文字リテラルを示すために一重引用符(アポストロフィ)を付けてください。

関連する問題