#include "stdio.h"
#include "string.h"
main()
{
char string[] = "october"; // october is 7 letters
strcpy(string, "september"); // september is 9 letters
printf("the size of %s is %d and the length is %d\n\n", string, sizeof(string), strlen(string));
return 0;
}
出力:
9月のサイズは8で、長さは9です
私の構文に何か問題がありますか?
sizeof
とstrlen()
は異なる動作をします。この場合、あなたの宣言
_char string[] = "october";
_
と同じです
_char string[8] = "october";
_
そのため、コンパイラはstring
のサイズが8であることを認識できます。これはコンパイル時に行われます。
ただし、strlen()
は、実行時に文字列の文字数をカウントします。したがって、strcpy()
を呼び出した後、string
には「september」が含まれるようになります。 strlen()
は文字をカウントし、そのうちの9つを見つけます。 string
が「9月」を保持するのに十分なスペースを割り当てていないことに注意してください。これは未定義の動作です。
出力は正しいため
最初のステートメントの文字列サイズは、コンパイラによって7 + 1に割り当てられました(10月はコンパイル時にNULLターミネータに対して7バイトと1バイトです)
2番目のステートメント:9月(9バイトから8バイトの文字列)をコピーしています。
あなたのために8バイトとして9月のサイズを取得しました(まだstrlen()
は9月には機能しません、それはnull文字を持っていません)
宛先配列は8バイト(「10月」の長さに\ 0を加えたもの)であり、その配列に9文字を入れます。
man strcpy
言います:strcpy()の宛先文字列が十分に大きくない場合、何でも起こります。
あなたが本当にやりたいことを教えてください