【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;
}