文字列クラスのポインターと整数の比較-C ++

2020-04-01 c++ pointers char implicit-conversion string-literals

C ++は初めてです。

string str = "WWWHBBB";
if(str[mid] == "H" && str[0] != "W") return; // corrected after comments for second operand

上記のif条件付きの行でエラーが発生します。

ポインターと整数の比較( 'std :: __ 1 :: basic_string、std :: __ 1 :: allocator> :: value_type'(aka 'char')and 'const char *')

配列スタイルのアクセスが文字列で問題ないことを知るのに十分なほどインターネットを検索しました。エラーは基本的にポインタと整数に関する比較を指摘しています。本当に?文字Hを文字列str別の文字と比較していると思いました。

str[mid]本当にイテレータを返すかどうかを試しましたが、 *str[mid]実行する必要があり*str[mid] 。いや!どちらも動作しませんでした。

Answers

あなたは単一のcharと比較したいでしょう

if (str[mid] == 'H' && str[mid] != 'W') return;

この場合の二重引用符はconst char[]指し、一重引用符は単一のchar指すことに注意してください。

警告は、あなたのケースでこれらの比較を行う唯一の方法は、lhs charstr[mid]結果)をrhsと比較することであり、配列を減衰させてconst char*して、ポインタアドレスを比較することです。 char

ifステートメントの式

 if(str[mid] == "H" && str[mid] != "W") return;

タイプconst char[2]の文字列リテラル「H」および「W」は、タイプconst char *最初の文字へのポインターに暗黙的に変換されます。

したがって、式str[mid]によって返されたstr[mid]ポインタと比較しようとしています。

文字列リテラルの代わりに、文字を比較するような文字リテラルを使用する必要があります

 if(str[mid] == 'H' && str[mid] != 'W') return;

次のように書くこともできます

 if(str[mid] == *"H" && str[mid] != *"W") return;

または

 if(str[mid] == "H"[0] && str[mid] != "W"[0]) return;

ポインタの逆参照ですが、これは混乱を招きます

str[mid] == 'H'場合、2番目のオペランドは常にtrueになることに注意してください。書くのに十分です

 if( str[mid] == 'H' ) return;

Related