C言語における文字列操作関数:strlen、strcpy、strcatの詳細解説

はじめに

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. 宛先バッファはコピーされる文字列(ヌル終端を含む)を保持できる十分な大きさが必要です。
  2. ソース文字列は有効なヌル終端文字列である必要があります。終端文字が見つかるまでコピーが続行されるため、バッファオーバーフローの原因となります。
  3. 宛先メモリ領域は書き込み可能である必要があります。書き込み不能なメモリ(文字列リテラルの格納領域など)を指定すると実行時エラーが発生します。

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関数を使用する際の注意点:

  1. 宛先バッファは元の文字列と追加する文字列(およびヌル終端)を保持できる十分な容量が必要です。
  2. 宛先文字列とソース文字列の両方が有効なヌル終端文字列である必要があります。
  3. 宛先バッファは変更可能なメモリ領域である必要があります。

タグ: C言語 文字列処理 strlen strcpy strcat

5月15日 03:39 投稿