広告スペース

第19回 文字列

C言語の文字列(char配列)の扱い方。strcpy, strlen, strcmp等の文字列関数。

文字列とは

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) == 00なら等しい、正/負で辞書順
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 を使いましょう。
バッファオーバーフローに注意:
strcpystrcat は書き込み先のサイズをチェックしません。
十分な大きさの配列を用意するか、strncpy で最大文字数を制限しましょう。

自分で書いてみよう ― 文字列

文字列を表示し、長さを出力するプログラムです。
string.c
出力
「実行」を押してください...
広告スペース

関連する講座

繰り返し・配列・文字列
第18回 配列
C言語の配列の宣言・初期化・アクセス方法。メモリ配置も図解。
入門編
第4回 printf・scanf
C言語のprintf関数とscanf関数の使い方。書式指定子を一覧で解説。
発展編
第25回 ポインタの基礎
C言語のポインタをメモリ可視化で理解。アドレスと間接参照を図解。
← 前の講座
第18回 配列
次の講座 →
第20回 関数(基本)

確認クイズ

この講座の理解度をチェックしましょう!

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 をインクルードして使います。

この記事をシェア
X(Twitter)でシェア Facebookでシェア LINEで送る はてブ

この講座の理解を深めるおすすめ書籍

サイトで動きを理解し、書籍で演習量を補うと効果的です

📘
苦しんで覚えるC言語
MMGames 著
初心者向けの定番入門書。丁寧な解説で基礎を固められます。
Amazonで見る
📗
新・明解C言語 入門編
柴田望洋 著
図解が豊富で、演習問題も充実。大学の教科書としても採用多数。
Amazonで見る
📙
プログラミング言語C 第2版
B.W.カーニハン, D.M.リッチー 著
通称K&R。C言語の原典。基礎を終えた後のステップアップに最適。
Amazonで見る

※ 上記リンクはアフィリエイトリンクです。購入によりサイト運営を支援いただけます。