【C言語】文字列とNULL文字

【C言語】文字列とNULL文字

C言語の文字列とは

C言語では、文字列は文字の配列として扱われます。特に、文字列の末尾には必ず '\0'(NULL文字)が付加されます。これにより、Cの標準関数は文字列の終端を認識できます。

例えば、以下のように文字列を定義できます:


char str1[] = "Hello";
char str2[] = {'H', 'e', 'l', 'l', 'o', '\0'};

どちらの宣言方法でも、最後に '\0' が含まれることで正しいCの文字列として機能します。

NULL文字とは

NULL文字('\0')は、C言語の文字列の終端を示す特別な文字です。文字コードとしては ASCII値の0に相当し、プログラムで明示的に指定することもできます。

例えば、以下のように手動でNULL文字を追加することが可能です:


char str[6] = {'H', 'e', 'l', 'l', 'o', '\0'};

NULL文字がないと、Cの標準関数は文字列の終端を判断できず、予期しない動作を引き起こす可能性があります。

文字列の初期化

文字列は配列として宣言できますが、NULL文字を考慮しないとバグの原因になります。以下の方法で文字列を正しく初期化できます。

リテラルを使用する場合


char str[] = "C Programming";

手動でNULL文字を付加する場合


char str[14] = {'C', ' ', 'P', 'r', 'o', 'g', 'r', 'a', 'm', 'm', 'i', 'n', 'g', '\0'};

ポインタを使用する場合


char *str = "Hello, World!";

ただし、ポインタを使用する場合は注意が必要です。特に、リテラル文字列は変更不可の領域に配置されるため、書き換えようとすると未定義動作が発生します。

標準ライブラリ関数での文字列操作

C言語では、文字列を操作するために <string.h> の関数が提供されています。

文字列の長さを取得する strlen()


#include <stdio.h>
#include <string.h>

int main() {
    char str[] = "C Language";
    printf("文字列の長さ: %lu\n", strlen(str));
    return 0;
}

文字列をコピーする strcpy()


char src[] = "Hello";
char dest[10];
strcpy(dest, src);

文字列を連結する strcat()


char str1[20] = "Hello, ";
char str2[] = "World!";
strcat(str1, str2);

文字列を適切に扱うための注意点

バッファオーバーフローの防止

文字列操作を行う際には、バッファオーバーフローを防ぐために、十分な領域を確保する必要があります。


char buffer[10];
strcpy(buffer, "TooLongString"); // バッファオーバーフローの可能性あり

NULL終端の確認

配列を手動で操作する際には、文字列の終端がNULLであることを必ず確認してください。


char str[5] = {'H', 'e', 'l', 'l', 'o'}; // NULL文字なし
printf("%s\n", str); // 未定義動作の可能性

文字列操作の具体例

文字列の反転


#include <stdio.h>
#include <string.h>

void reverse(char *str) {
    int len = strlen(str);
    for (int i = 0; i < len / 2; i++) {
        char temp = str[i];
        str[i] = str[len - 1 - i];
        str[len - 1 - i] = temp;
    }
}

int main() {
    char str[] = "Hello";
    reverse(str);
    printf("反転後: %s\n", str);
    return 0;
}

文字列の比較


#include <stdio.h>
#include <string.h>

int main() {
    char str1[] = "apple";
    char str2[] = "banana";

    if (strcmp(str1, str2) < 0) {
        printf("%s は %s より前\n", str1, str2);
    } else {
        printf("%s は %s より後\n", str1, str2);
    }
    return 0;
}

特定の文字をカウント


#include <stdio.h>

int count_char(const char *str, char ch) {
    int count = 0;
    while (*str) {
        if (*str == ch) count++;
        str++;
    }
    return count;
}

int main() {
    char str[] = "banana";
    char target = 'a';
    printf("%c の出現回数: %d\n", target, count_char(str, target));
    return 0;
}

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です