【C言語】文字列の基本と安全な扱い方
文字列とは
C言語では、文字列は char 型の配列 として扱われます。そして必ず最後に NULL文字(’\0’) が付くのが大きな特徴です
#include <stdio.h>
int main(void) {
char str[] = "Hello, C!";
printf("%s\n", str);
return 0;
}%s は文字列を表示するためのフォーマット指定子で、str は char 配列として渡されています
見た目は一つのデータに見えても、中身は「文字の並び」になっています
文字列操作関数
C言語には文字列専用の関数が <string.h> に用意されています
自分で1文字ずつ処理しなくても、よく使う操作は関数で行えます
文字列の長さを調べる
#include <stdio.h>
#include <string.h>
int main(void) {
char str[] = "Hello, C!";
printf("文字列の長さ: %lu\n", strlen(str));
return 0;
}strlen は NULL文字を含まない文字数 を返します
配列サイズとは違う点に注意が必要です
文字列のコピー
#include <stdio.h>
#include <string.h>
int main(void) {
char str1[] = "Hello";
char str2[20];
strcpy(str2, str1);
printf("コピー後: %s\n", str2);
return 0;
}コピー先の配列サイズが足りないと、メモリ破壊の原因になります
C言語では 安全かどうかを自分で管理する必要がある という点がとても重要です
文字列の結合
#include <stdio.h>
#include <string.h>
int main(void) {
char str1[20] = "Hello";
char str2[] = ", C!";
strcat(str1, str2);
printf("結合後: %s\n", str1);
return 0;
}結合後の長さを考えて、十分なサイズを確保しておく必要があります
文字列の比較
#include <stdio.h>
#include <string.h>
int main(void) {
char str1[] = "abc";
char str2[] = "abd";
int result = strcmp(str1, str2);
if(result == 0) {
printf("同じ文字列\n");
} else if(result < 0) {
printf("str1 < str2\n");
} else {
printf("str1 > str2\n");
}
return 0;
}strcmp は文字コード順で比較します
文字列同士は == では比較できない点も初心者がつまずきやすいポイントです
文字列の検索
#include <stdio.h>
#include <string.h>
int main(void) {
char str[] = "Hello, C!";
char *p = strchr(str, 'C');
if(p != NULL) {
printf("見つかった位置: %ld\n", p - str);
} else {
printf("見つからなかった\n");
}
return 0;
}strchr は最初に見つかった文字のポインタを返します。見つからなかった場合は NULL
strchr は見つかった位置の ポインタ を返します
見つからない場合は NULL が返るので、必ずチェックが必要です
まと
- C言語の文字列は char 型の配列であり、必ず NULL 文字で終わる
- 文字列操作には
<string.h>の関数を使うと効率的 - コピーや結合では配列サイズ不足によるバグに特に注意
- 文字列比較は
strcmpを使い、==は使わない - ポインタを返す関数では NULL チェックを忘れない
このあたりを押さえておくと、C言語での文字列処理が一気に安定するよ