C言語学習ポータル(無料版) 学習コンテンツ 文字列 文字列とはchar配列である

🔤 文字列

文字列とは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文字。配列の技がそのまま通用します。

要点まとめ

アプリで演習問題まで解く(無料・登録不要)

この項目に出てくる用語

文字列もじれつ

文字が連なったデータのこと。C言語ではchar型の配列として表現され、その末尾には終わりを示す番人の文字が置かれる。"Hello"のようにダブルクォートで囲んで書くのが文字列リテラル。

配列はいれつ

同じ型の値を一列に並べて、まとめて管理するデータ構造のこと。1つの名前で複数の値をまとめて扱える、箱の行列のようなもの。int arr[5];のように、要素の型と個数を指定して宣言する。

添字(インデックス)そえじ

配列の中の何番目の要素かを指定する番号のこと。C言語では、この番号を0から数え始める点にとくに注意が必要になる。要素数が5個の配列なら、添字は0から4までの範囲になる。

for文ふぉーぶん

「初期化・条件・更新」の3つを1行にまとめて書ける繰り返し構文のこと。回数があらかじめ決まっている繰り返しにとくに向いている。繰り返す回数があらかじめはっきりしている場面で、とくに書きやすい構文。

同じトラックのほかの項目

ヌル終端 '\0' の掟ヌル終端の役割を理解し、必要な配列サイズを正しく見積もれる 文字列リテラルと初期化文字列の初期化の書き方を使い分け、代入できない理由を説明できる string.h の主要関数strlen・strcpy・strcat・strcmp の役割と使い方を説明できる 安全な文字列操作——バッファサイズの意識バッファオーバーフローの危険を理解し、snprintfやfgetsで安全に書ける 文字の判定と変換(ctype.h)ctype.hの判定・変換関数を使って、文字の種類を調べたり大文字小文字を変換できる 文字コードの基礎——ASCIIとUTF-8文字が数値であることを理解し、文字コードを使った計算ができる 文字列処理の定石パターン文字列を1文字ずつ走査する型を身につけ、数える・削る・逆順にするが書ける
ヌル終端 '\0' の掟 ›

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

完全版(BOOTH)を見る

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

Web版 / BOOTH