文字列とは
C言語には「文字列型」はありません。代わりにchar型の配列を使って文字列を表現します。
ポイント:文字列の最後には必ずヌル文字 '\0'が入り、「ここで文字列が終わり」という目印になります。
char name[20] = "Claude"; // 最大19文字 + '\0'
printf("%s\n", name); // → Claude
%s は文字列用の書式指定子。配列名だけを渡します(先頭アドレスが渡る)。
文字配列とメモリ配置
文字列 "Hello" がメモリにどう並ぶかを見てみましょう。
char msg[6] = "Hello"; ← 6バイト確保される(5文字 + '\0')
サイズに注意!「Hello」5文字でも、終端のヌル文字('\0')を含めて6バイト必要です。配列サイズが足りないとバッファオーバーフローのバグになります。
文字列の入出力
文字列を入出力するには %s を使います。scanfでは & を付けないのが特徴!
char name[20];
printf("名前は? ");
scanf("%s", name); // & は不要
printf("こんにちは、%sさん\n", name);
なぜ & が不要? 配列名 name は、それ自体が先頭要素のアドレスとして扱われます。だから & を付けなくてもアドレスが渡るのです。
⚠️ scanf("%s") の落とし穴:空白で区切られる&入力長のチェックをしません。長すぎる入力で配列をオーバーフローする危険があります(実務では fgets が安全)。
文字列の長さを数える
strlen(標準ライブラリ)を使えば簡単ですが、仕組みを知るため「自作版」を見てみましょう。
// '\0' が来るまで数える
int myStrlen(char s[]){
int i = 0;
while(s[i] != '\0') i++;
return i;
}
int main(void){
char msg[] = "Hello";
printf("%d\n", myStrlen(msg)); // → 5
}
ヌル文字 '\0' がなぜ重要か分かりますね。終端を判定する目印として必須なのです。
string.h 関数一覧
#include <string.h> で使える、文字列操作の主要関数をまとめます。
| 関数 | 機能 | 使用例 | 注意点 |
strlen(s) | 文字列の長さ | strlen("abc") → 3 | '\0' は含まない |
strcpy(dst, src) | 文字列コピー | strcpy(s, "Hello") | dst に十分なサイズが必要 |
strncpy(dst, src, n) | 最大n文字コピー | strncpy(s, src, 10) | バッファオーバーフロー防止 |
strcat(dst, src) | 文字列の連結 | strcat(s, " World") | dst に連結後のサイズが必要 |
strcmp(s1, s2) | 文字列の比較 | strcmp(a, b) == 0 | 0なら等しい、正/負で辞書順 |
strncmp(s1, s2, n) | 先頭n文字を比較 | strncmp(s, "ab", 2) | 部分一致の判定に便利 |
strchr(s, c) | 文字を検索 | strchr(s, 'o') | 見つからなければNULL |
strstr(s, sub) | 部分文字列を検索 | strstr(s, "llo") | 見つからなければNULL |
strcpy と strcat の例
#include <stdio.h>
#include <string.h>
int main(void) {
char greeting[50];
strcpy(greeting, "Hello"); // greeting = "Hello"
strcat(greeting, ", World!"); // greeting = "Hello, World!"
printf("%s (%lu文字)\n", greeting, strlen(greeting));
return 0;
}
== で文字列を比較しない!
if (s1 == s2) はアドレスの比較であり、文字列の内容は比較されません。
文字列比較には必ず strcmp(s1, s2) == 0 を使いましょう。
バッファオーバーフローに注意:
strcpy や strcat は書き込み先のサイズをチェックしません。
十分な大きさの配列を用意するか、strncpy で最大文字数を制限しましょう。
自分で書いてみよう ― 文字列
文字列を表示し、長さを出力するプログラムです。
確認クイズ
この講座の理解度をチェックしましょう!
Q1. C言語の文字列の末尾には何がある?
改行文字 \n
ヌル文字 \0
スペース
C言語の文字列は必ずヌル文字 \0 で終端されます。これにより文字列の長さを判別できます。
Q2. "Hello" を格納するのに必要な配列サイズは?
5
6
7
"Hello" は5文字 + 終端の \0 で合計6バイト必要です。char s[6] 以上が必要です。
Q3. 文字列のコピーに使う関数は?
strcpy
strcmp
strlen
strcpy がコピー、strcmp が比較、strlen が長さ取得です。string.h をインクルードして使います。
この講座の理解を深めるおすすめ書籍
サイトで動きを理解し、書籍で演習量を補うと効果的です
📘
苦しんで覚えるC言語
MMGames 著
初心者向けの定番入門書。丁寧な解説で基礎を固められます。
Amazonで見る
📗
新・明解C言語 入門編
柴田望洋 著
図解が豊富で、演習問題も充実。大学の教科書としても採用多数。
Amazonで見る
📙
プログラミング言語C 第2版
B.W.カーニハン, D.M.リッチー 著
通称K&R。C言語の原典。基礎を終えた後のステップアップに最適。
Amazonで見る
※ 上記リンクはアフィリエイトリンクです。購入によりサイト運営を支援いただけます。