はじめに
C言語では文字と文字列の処理が頻繁に行われますが、C言語自体には組み込みの文字列型が存在しません。文字列は通常、文字配列または文字列定数として扱われます。文字列定数は、その内容を変更しない文字列操作関数に使用されます。
1. 文字列操作関数の詳細
1.1 strlen関数
strlen関数:文字列長の計算
文字列の長さを計算する関数です。終端のヌル文字 ('\0') を除いた文字数を返します。
#include <stdio.h>
#include <string.h>
int main() {
char sample_str[] = "abcdef";
size_t string_length = strlen(sample_str);
printf("%zu\n", string_length);
return 0;
}
このコードは「6」を出力します。strlen関数はヌル終端文字列を前提としています。適切な終端文字がない場合、予測不可能な結果(未定義動作)を引き起こします。
strlen関数の戻り値の型はsize_t(符号なし整数)です。次の例に注意してください:
#include <stdio.h>
#include <string.h>
int main() {
if(strlen("abc") - strlen("abcdef") > 0) {
printf("Greater than zero\n");
} else {
printf("Less than or equal to zero\n");
}
return 0;
}
両方のstrlen呼び出しは符号なし整数を返すため、減算の結果も符号なし整数として解釈され、常に正の値(またはゼロ)となります。この例では「Greater than zero」が出力されます。
1.2 strcpy関数
strcpy関数:文字列のコピー
ソース文字列(ヌル終端を含む)を宛先バッファにコピーします。
#include <stdio.h>
#include <string.h>
int main() {
char destination_buffer[20] = {0};
strcpy(destination_buffer, "zhangsan");
printf("%s\n", destination_buffer);
return 0;
}
注意点:
- 宛先バッファはコピーされる文字列(ヌル終端を含む)を保持できる十分な大きさが必要です。
- ソース文字列は有効なヌル終端文字列である必要があります。終端文字が見つかるまでコピーが続行されるため、バッファオーバーフローの原因となります。
- 宛先メモリ領域は書き込み可能である必要があります。書き込み不能なメモリ(文字列リテラルの格納領域など)を指定すると実行時エラーが発生します。
1.3 strcat関数
strcat関数:文字列の連結
ソース文字列を宛先文字列の末尾に追加します。
#include <stdio.h>
#include <string.h>
int main() {
char base_string[20] = "hello";
strcat(base_string, " world");
printf("%s\n", base_string);
return 0;
}
このコードは「hello world」を出力します。strcat関数を使用する際の注意点:
- 宛先バッファは元の文字列と追加する文字列(およびヌル終端)を保持できる十分な容量が必要です。
- 宛先文字列とソース文字列の両方が有効なヌル終端文字列である必要があります。
- 宛先バッファは変更可能なメモリ領域である必要があります。