トラック9・🔤文字列

文字列とはchar配列である

読む目安 約12分・ゴール:Cの文字列がchar配列であることを理解し、宣言・表示・1文字ずつのアクセスができる

アプリでこのトピックを学ぶ(無料・登録不要)

このトピックの要点

多くのプログラミング言語には「文字列型」という専用の型があります。Cにはありません。Cの文字列は char の配列、それだけです。この一文が、このトラック全体の土台になります。

まず1文字。char は文字1個を入れる型で、シングルクォートで書きます。

char c = 'A';
printf("%c\n", c);   // A

文字が複数並んだものが文字列です。だから char の配列を使います。

#include <stdio.h>

int main(void)
{
    char s[6] = "hello";

    printf("%s\n", s);      // hello ← 文字列は %s
    printf("%c\n", s[0]);   // h     ← 1文字は %c
    return 0;
}

"hello" は5文字なのに、なぜ配列は6個ぶんなのでしょうか。最後に終わりの印が1つ入るからです。これが次のトピックの主役、ヌル文字です。

なぜ専用の型がないのか

Cが作られた1970年代、コンピュータのメモリは現在の何十万分の1しかありませんでした。言語に機能を足せば、その分だけ実行時の負担が増えます。Cは「文字が並んでいるだけ」という最小の表現を選び、細かい処理はプログラマと標準関数に任せました。おかげでCは小さく速い言語になり、その代わり、文字列の扱いには少しの手間と注意が必要になっています。これから出てくる約束事は、すべてこの割り切りから来ています。

文字列を作る3つの場面

  1. 決まった文字列を持ちたい → char s[] = "hello";
  2. あとから中身を入れる箱がほしい → char buf[64];(大きさを多めに取る)
  3. 入力を受け取りたい → char line[64]; に読み込む

どの場合も「char の配列」であることは変わりません。違うのは大きさの決め方だけです。

1文字ずつ触れる

文字列は配列なので、添字でどの文字にも直接アクセスできます。

#include <stdio.h>

int main(void)
{
    char s[6] = "hello";

    s[0] = 'H';             // 1文字だけ書き換える
    printf("%s\n", s);      // Hello

    for (int i = 0; i < 5; i++) {
        printf("[%c]", s[i]);   // [H][e][l][l][o]
    }
    printf("\n");
    return 0;
}

配列でできることは、文字列でも全部できます。前のトラックで身につけた「for文で全要素を回す」型が、そのまま使えるわけです。

クォートの違いに敏感になる

見た目はよく似ていますが、まったくの別物です。char c = "A"; と書くとコンパイラに怒られます。キーボードの入力ミスで起きやすい間違いなので、エラーが出たらまずクォートの種類を疑ってください。

罠・注意

ポインタ姫この配列の正体は、次の洞窟で明かしますわ

まとめ: Cの文字列は char の配列。%s で丸ごと、%c で1文字。配列の技がそのまま通用します。

アプリでこのトピックを学ぶ(無料・登録不要)

確認問題

確認問題 1

C言語の文字列について、正しい説明はどれですか。

  1. string型という専用の型がある
  2. char型の配列で表す
  3. int型の配列で表す
  4. 文字列は変数に入れられない
答えを見る

正解:B(char型の配列で表す)

Cに文字列型はありません。文字1個が char、それが並んだ char の配列が文字列です。配列なので、添字での1文字アクセスやforでの走査がそのまま使えます。

確認問題 2

"hello"(5文字)を入れるのに必要な、最小の配列の大きさを選んでください。

char s[____] = "hello";
  1. 6
  2. 5
  3. 4
  4. 10
答えを見る

正解:A(6)

文字数5に、終わりの印 '\0' の1つを足して6が必要です。「文字数 + 1」はCの文字列で最も大切な計算で、この +1 を忘れる事故が最も多く起こります。

「文字列」の目次

  1. 文字列とはchar配列である
  2. ヌル終端 '\0' の掟
  3. 文字列リテラルと初期化
  4. string.h の主要関数
  5. 安全な文字列操作——バッファサイズの意識
  6. 文字の判定と変換(ctype.h)
  7. 文字コードの基礎——ASCIIとUTF-8
  8. 文字列処理の定石パターン

もっと先へ:ポインタ・メモリ・ファイル入出力・セキュアコーディングを含む全26トラックと、段位検定・模試のフルセットは完全版に収録しています。

完全版の販売ページは準備中です。

ほかのトラック

📚 姉妹教材:手を動かして覚える Linux 教材 — Linuxとインフラの仕組みを地図で学ぶ

Web版