7

私はこのコードを持っています:

char *name = "George"

if(name == "George")
   printf("It's George")

==c の文字列は符号と比較できず、 を使用する必要があると考えましたstrcmp。理由は不明ですが、gcc (バージョン 4.7.3) でコンパイルすると、このコードは機能します。ポインターを比較するようなものなので、これは間違っていると思ったので、Googleで検索したところ、多くの人がそれは間違っていて比較==できないと言っています。では、なぜこの比較方法が機能するのでしょうか。

4

5 に答える 5

28

C 文字列は == 記号で比較できず、strcmp を使用する必要があると考えました

右。

これはポインターを比較するようなものなので間違っていると思いましたので、Googleで検索したところ、多くの人が間違っていると言い、==での比較はできません

そうです。

では、なぜこの比較方法が機能するのでしょうか。

それは「うまくいきません」。機能しているように見えるだけです。

これが発生する理由は、おそらくコンパイラの最適化です。2 つの文字列リテラルは同一であるため、コンパイラは実際にはそれらのインスタンスを 1 つだけ生成し、文字列リテラルが参照されるたびにまったく同じポインタ/配列を使用します。

于 2013-07-22T07:16:17.813 に答える
5

実行した比較では、2 つの文字列の内容ではなく位置が比較されます。コンパイラが文字を含む文字列リテラルを1 つだけ作成することを決定したのは偶然です"George"。これは、格納されている文字列nameの場所と秒の場所が"George"同じであることを意味するため、比較はゼロ以外を返します。

ただし、コンパイラはこれを行う必要はありません。場所は異なるが内容が同じである 2 つの異なる文字列リテラルを同じように簡単に作成でき、比較はゼロを返します。

于 2013-07-22T07:19:48.517 に答える
1

2 つの別個の文字列の 2 つの異なるポインターを比較しているため、これは失敗します。このコードがまだ機能する場合、これは GCC の大幅な最適化の結果であり、サイズの最適化のために 1 つのコピーのみが保持されます。

を使用しstrcmp()ます。リンク

于 2013-07-22T07:16:09.220 に答える
-1

これらの文字列の実際の文字ではなく、これらの文字列のベースアドレスを比較している2つの文字列を比較すると。strcmp()文字列の使用とstrcasecmp()ライブラリ関数を比較したり、このようなプログラムを書いたりします。以下は完全なコードではなく、文字列比較に必要なロジックだけです。

void mystrcmp(const char *source,char *dest)
{
    for(i=0;source[i] != '\0';i++)
        dest[i] = source[i];
   dest[i] = 0;

}
于 2013-07-22T07:57:27.087 に答える