1

コード:

#include <stdio.h>

int main()
{
    char str1[]="bombay";
    char str2[]="pune";

    char *s1 = str1;
    char *s2 = str2;

    while(*s1++ = *s2++);
    printf("%s\n",str1);
}

出力:(GCC コンパイラ)

pune

しかし、私によると、出力はpuneay. puneの代わりにコピーしbomb、残りはそのままにする必要があります。

では、コンパイラがこのコードの出力を「puneay」ではなく pune」にするのはなぜですか?

4

5 に答える 5

12

文字列の最後にヌル ターミネータがあり、これもコピーされます。

null ターミネータがコピーされると、while の実行が停止し、結果が出力されます。

したがって、メモリにはstr1実際には次のものが含まれます。'p' 'u' 'n' 'e' '\0' 'y' '\0'

于 2018-08-14T11:59:40.887 に答える
1

残念ながら、この種のずさんなコードは、ポインター演算を使用して C で文字列をコピーしたい場合によく見られます。コードはこれと 100% 同等です。

*s1 = *s2;
while(*s1 != '\0')
{
  s1++;
  s2++;
  *s1 = *s2;
}

目的は「貧乏人の」を与えることstrcpyです。null ターミネータは常に宛先バッファにコピーされるため、記述された出力が得られます。

于 2018-08-14T12:47:29.700 に答える