web-dev-qa-db-ja.com

文字列内の文字と指定された文字を比較します

私は以下を持っています:

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でも比較を試みました(文字列の最初の文字と指定された文字の比較)。

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

しかし、比較が正しいはずですが、それが「もの」になることはありません。

どうすればいいですか?

9
Itzik984

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

引用のタイプが重要であることに注意してください! ')'は文字ですが、")"は文字列です(つまり、')' charの後にnullターミネータが続きます)。

したがって、2つの文字を比較できます。

str[0] == ')'

または、2つの文字列を比較できます

strcmp(str, ")") == 0

当然、(2番目はstr文字列が実際にその括弧のみを含む場合に機能します)。

18
Imp

文字(str[0])とconst char[N]"whatever")を比較しています。二重引用符は文字配列を表すので、一重引用符は単一文字を表すため、一重引用符を使用する必要があります。

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

等。

strcmpも失敗した理由は、文字列が)を指すこともあるが、それ以上の文字が含まれている(つまり、直後に'\0'が続いていない)ため、文字列は同等ではないためです1文字の文字列")"に変更します。

4
Seth Carnegie

二重引用符、_"_は文字列の区切り文字であるため、_")"_はif(str[0] == "(")の文字列リテラルへのポインターです。文字と比較したいので、一重引用符を使用する必要があります

_if(str[0] == '(')
_
2
Daniel Fischer

if (str[0] == ')')などが必要です。文字リテラルを示すには、単一引用符(アポストロフィ)に注意してください。

1
Kerrek SB