1
#include <stdio.h>
#include <string.h>
#include <stdlib.h>

int main()
{
  static char s1[]="Good";
  static char s2[20];
  static char s3[20]="Day";

  int i = strcmp(strcat(s3,strcpy(s2,s1)),strcat(s3,"good"));

  printf("%d\n",i);

  return 0;
}

ここで、出力は 0 です。これは、引数として渡された 2 つの文字列strcmpが等しいことを意味します。しかしstrcmp、最初の引数は"DaygoodGood"であり、2 番目の引数は"Daygood"...

なぜこうなった?

4

4 に答える 4

4

どのように見ても、あなたは と比較s3しています。s3そうすれば必ず対等になります。分解してください-変更:

    i=strcmp(strcat(s3,strcpy(s2,s1)),strcat(s3,"good"));

の中へ:

    char *s4 = strcpy(s2,s1);     // s4 == s2 -> "Good"
    char *s5 = strcat(s3,s4);     // s5 == s3 -> "DayGood"
    char *s6 = strcat(s3,"good"); // s6 == s3 -> "DayGoodgood"

    i = strcmp(s5, s6);           // same as strcmp(s3, s3)

それが本当にこのように起こるのか、それとも次のようになるのか:

    char *s4 = strcpy(s2,s1);     // s4 == s4 -> "Good"
    char *s6 = strcat(s3,"good"); // s6 == s3 -> "Daygood"
    char *s5 = strcat(s3,s4);     // s5 == s3 -> "DaygoodGood"

    i = strcmp(s5, s6);           // same as strcmp(s3, s3)

代わりに、標準では指定されていません。とにかく、連結が発生する順序に関係なく、同一の文字列を比較しています。比較"DayGoodgood"するのは"DayGoodgood"または"DaygoodGood"ですが、どちらの方法でも結果として"DaygoodGood"期待する必要があります。0

于 2013-08-30T18:55:57.187 に答える
3

結果strcat(t, s)常に と等しくなりtます。これが紛らわしい場合は、C の文字列は文字ポインターであることを思い出してください。したがって、2 つのポインターが等しいことについて話しているのであって、string の (以前または現在の) 内容について話しているわけではありませんt

したがって、その時点で何が含まれていても、比較される 2 つの文字列はs3とです。もちろん、それらは等しいです。s3s3

于 2013-08-30T18:56:02.360 に答える
1

これは、firstがsecond と同様に をstrcat返すためです。s3最初の呼び出しはs3のコンテンツに何かを追加し、2 番目の呼び出しはさらに追加しますが、どちらも同じポインターを返します。

于 2013-08-30T18:56:16.077 に答える