C言語では他の言語と異なり「+」演算子による文字列の結合ができません。
C言語の文字列はchar型の配列なので、加算を行った場合には先頭アドレスの値のみ加算がされた、文字列の結合は行われません。
この記事では、C言語の正しい文字の結合をする方法を紹介します。
文字の結合をする方法
C言語で文字の連結を行う場合には、標準関数のstrcat関数を使用します。
strcat関数は第一引数に結合を行う文字列変数を、第二引数に結合される文字列変数を指定し、戻り値として結合後の文字列の先頭アドレス(第一引数と同じ)を返します。
処理としては第一引数の後ろに第二引数を結合して第一引数を返却するので、第一引数に渡した変数はデータが変化するので注意が必要です。
1 2 3 4 5 6 |
// 結合される文字 char s1[16] = "hoge"; // 結合する文字 char s2[] = "hage"; // 文字の結合 strcat(s1, s2); // s1が[hogehage]になる |
この時に、第一引数に指定した文字列のサイズが結合後の文字列サイズよりも小さい場合には動作未定義となります。
strcat関数を自作
strcat関数の使い方がわかったところで、挙動のさらなる理解を深めるためにstrcat関数を自作してみます。
先述した通りstrcat関数は第一引数の末尾に第二引数を先頭からコピーします。
- 結合を行う文字列の末尾を探索
- 結合される文字を先頭から走査し[1]の位置から順にコピー
- 結合される文字が終端文字なら終端文字をコピーして終了
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
// 自作strcat char* my_strcat(char* s1, const char* s2) { // ループ変数 int i = 0, j = 0; // s1の末尾を探索 for(; s1[i] != '\0'; i++); // s2の先頭から順にコピー for(; s2[j] != '\0'; j++) { s1[i + j] = s2[j]; } // 終端文字をコピー s1[i + j] = s2[j]; return s1; } |