C言語では他の言語と異なり文字列の直接代入ではコピーができません。
C言語の文字列はchar型の配列なので、直接代入を行った場合には先頭アドレスのみがコピーされて、実体のコピーは行われません。
この記事では、C言語の正しい文字コピーの方法を紹介します。
文字コピーの方法
C言語で文字コピーを行う場合には、標準関数のstrcpy関数を使用します。
strcpy関数は第一引数にコピー先の変数を、第二引数にコピー元の変数を指定し、戻り値としてコピー先の先頭アドレスを返します。(戻り値は使わなくても良いです)
1 2 3 4 5 6 |
// コピー元 char s1[] = "hogehoge"; // コピー先 char s2[9]; // 文字コピー strcpy(s2, s1); |
この時に、コピー元の文字列長よりもコピー先の要素数が小さい場合には動作未定義となります。
また、strcpy関数ではコピー元の終端文字までをコピーするため、コピー元文字列に終端文字が存在しない場合にも動作未定義となります。
strcpy関数を自作
strcpy関数の使い方がわかったところで、挙動のさらなる理解を深めるためにstrcpy関数を自作してみます。
先述した通りstrcpy関数はコピー元文字列の先頭から走査して終端文字が見つかるまでをコピー先文字列にコピーします。
- コピー元文字列を先頭から走査
- 終端文字でなければコピー先文字列にコピー
- 終端文字なら終端文字をコピーして終了
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
// 自作strcpy char* my_strcpy(char* s1, const char* s2) { // ループ変数 int i = 0; // コピー元文字列を先頭から終端文字が見つかるまで走査 for(; i < s2[i] != '\0'; i++) { // コピー先文字列にコピー s1[i] = s2[i]; } // 終端文字をコピー s1[i] = s2[i]; return s1; } |