C言語のきほん|文字定数と文字列リテラル

1文字の違いが、プログラムの意味を大きく変える。文字定数と文字列リテラルをここでしっかり整理しよう。

C言語を学び始めると、見た目がよく似ているのに意味がまったく違う書き方がいくつか出てきます。
その代表が、文字定数と文字列リテラルです。

たとえば、A と書くのか、"A" と書くのかで、C言語の中では別物として扱われます。
見た目はどちらも「A」ですが、前者は1文字、後者は文字の並び(文字列)です。

この違いをあいまいなまま進めてしまうと、printf の表示、配列、ポインタ、文字列処理のところで混乱しやすくなります。
逆にここを丁寧に理解しておくと、今後の学習がかなりスムーズになります。

今回は、文字定数と文字列リテラルの基本を、サンプルプログラムといっしょにわかりやすく整理していきます。
途中で、よく間違えやすいポイントも表や図で確認しながら進めます。

文字定数とは

文字定数は、1文字だけを表す定数です。
書き方は、シングルクォーテーションで囲む形です。

例:

  • A を表す文字定数 → 'A'
  • 改行を表す文字定数 → '\n'

ここで大事なのは、'\n' は見た目では 2文字に見えても、C言語では 改行という1文字として扱われることです。
つまり、\ と n を別々の2文字として扱うのではなく、1つの特別な文字(エスケープシーケンス)として扱います。

文字定数のポイント

項目内容
意味単一の文字を表す
書き方シングルクォーテーションで囲む
'A'、'9'、'\n'
よくある勘違い"A" と同じだと思ってしまう(実際は別物)

文字列リテラルとは

文字列リテラルは、0文字以上の文字の並びを表します。
書き方は、ダブルクォーテーションで囲む形です。

例:

  • "ABC"
  • "X"
  • ""

ここで "" は、文字が1つも入っていない空文字列です。
空でも、ダブルクォーテーションで囲まれていれば、ちゃんと有効な文字列リテラルです。

文字列リテラルの重要ポイント(ナル文字)

C言語では、文字列リテラルの終わりには自動的に ナル文字 が付きます。
ナル文字は、文字列の終端を表す特別な文字で、\0 で表します。

たとえば "ABC" は、メモリ上では次のようになります。

"A" "B" "C" "\0"

より正確には、1文字ずつ並んでいます。

['A']['B']['C']['\0']

この \0 があるおかげで、C言語の関数は「どこまでが文字列か」を判断できます。
つまり、文字列処理では \0 がとても大事です。

文字列リテラルのポイント

項目内容
意味文字の並び(文字列)
書き方ダブルクォーテーションで囲む
"ABC"、"X"、""
終端自動的に \0 が付く
よくある勘違い1文字なら文字定数と同じだと思う("A" と 'A' は別物)

文字定数と文字列リテラルの違いを並べて確認

この2つは、見た目が似ていても用途が違います。ここは最重要ポイントです。

比較項目文字定数文字列リテラル
'A'"A"
表すもの1文字文字の並び
クォーテーションシングルクォーテーションダブルクォーテーション
メモリのイメージ1文字分文字列 + 終端の \0
よく使う場面char 変数への代入printf での表示、文字列処理

イメージ図

この違いがわかると、なぜ printf で %c と %s を使い分けるのかも自然に理解しやすくなります。

サンプルプログラムで確認する

ファイル名:4_5_1.c

#include <stdio.h>

int main(void)
{
    /* 整数定数を使って個数を初期化する */
    int count = 7;
    printf("個数: %d\n", count);

    /* 浮動小数点定数を使って気温を初期化する */
    double temperature = 23.5;
    printf("気温: %.1f度\n", temperature);

    /* 文字定数を使って評価記号を代入する */
    char grade = 'B';
    printf("評価記号: %c\n", grade);

    /* 文字列リテラルを直接表示する */
    printf("メッセージ: %s\n", "C言語を楽しく学ぼう!");

    return 0;
}

実行結果例

個数: 7
気温: 23.5度
評価記号: B
メッセージ: C言語を楽しく学ぼう!

サンプルプログラムの見どころ

整数定数の使い方

int count = 7;

ここでは 7 という整数定数を使って、int型の変数 count を初期化しています。
整数をそのまま書いて使う、もっとも基本的な形です。

浮動小数点定数の使い方

double temperature = 23.5;

23.5 は浮動小数点定数です。
小数を扱いたいときは、int ではなく double や float を使います。

printf では %.1f としているので、小数点以下1桁まで表示しています。

文字定数の使い方

char grade = 'B';

ここが今回のテーマの1つです。
B は文字として扱いたいので、シングルクォーテーションで囲んで 'B' と書きます。

もしここを "B" にすると、文字列リテラルになってしまい、char型1文字とは意味が合わなくなります。

文字列リテラルの使い方

printf("メッセージ: %s\n", "C言語を楽しく学ぼう!");

"メッセージ: %s\n" も、"C言語を楽しく学ぼう!" も、どちらも文字列リテラルです。
printf は %s を使うと文字列を表示できます。

このように、文字列リテラルは変数に入れなくても、関数の引数として直接渡すことができます。

よく間違えやすいポイント

'A' と "A" は同じではない

これは本当に大事です。見た目は似ていますが、C言語では意味が違います。

  • 'A' は文字定数(1文字)
  • "A" は文字列リテラル(A と \0 の並び)

なので、次のように使い分けます。

char c = 'A';        /* OK */
printf("%c\n", c);   /* 文字として表示 */

printf("%s\n", "A"); /* 文字列として表示 */

文字列の終わりには \0 が必要

文字列リテラルでは、終端に \0 が自動で付きます。
このルールがあるから、C言語の文字列関数は正しく動けます。

たとえば "猫" も、内部的には「文字データ + \0」という形です。
日本語は環境や文字コードによって1文字のバイト数が変わることがありますが、文字列の終端として \0 を使う考え方は同じです。

エスケープシーケンスは1文字として扱う

'\n' は2文字に見えますが、C言語では改行という1文字です。
同じように、'\t' はタブ文字、'\' はバックスラッシュ1文字を表します。

書き方意味
\n改行
\tタブ
\バックスラッシュ
"ダブルクォーテーション(文字列中で使う)

文字定数と文字列リテラルを使うときの考え方

迷ったときは、まず「それは1文字なのか、文字の並びなのか」を考えると整理しやすいです。

  • 1文字を扱いたい → 文字定数(例: 'A')
  • 文字の並びを扱いたい → 文字列リテラル(例: "A"、"ABC")

この判断ができるようになると、char型、文字配列、printf、scanf、文字列関数の理解がぐっと進みます。

4章の確認問題(○×形式)

次の項目について、正しいものには○、間違っているものには×をつけてください。

① 文字定数はダブルクォーテーションで囲んで表記する。
② 文字列リテラルは0文字でも有効であり、"" は正しい。
③ '\n' は C言語では2文字として扱われる。
④ "ABC" という文字列リテラルの終端には、自動的に \0 が追加される。
⑤ char c = "A"; は、文字列リテラルを1文字として扱うので正しい。
⑥ char c = 'A'; は、文字定数をchar型変数に代入しているので正しい。
⑦ printf("%c\n", 'Z'); は、文字定数を1文字として表示するコードとして適切である。
⑧ printf("%s\n", 'Z'); は、文字定数を文字列として表示できるので正しい。
⑨ "A" は見た目は1文字だが、文字列として扱われる。
⑩ 文字列リテラル "Hi" は、メモリ上では H、i、\0 の並びになる。

解答と解説

① ×
文字定数はシングルクォーテーションで囲みます。ダブルクォーテーションで囲むと文字列リテラルになります。
例として、'A' は文字定数、"A" は文字列リテラルです。

② ○
文字列リテラルは0文字以上の文字の列なので、"" は有効です。空文字列として扱われます。

③ ×
\n はエスケープシーケンスで、C言語では改行を表す1文字として扱われます。見た目は2文字に見えても、意味としては1文字です。

④ ○
文字列リテラルの終端には、自動的にナル文字 \0 が追加されます。
"ABC" はメモリ上で A、B、C、\0 の並びとして扱われます。

⑤ ×
"A" は文字列リテラルなので、char型1文字にはそのまま代入できません。
char型に入れるなら 'A' を使います。

⑥ ○
'A' は文字定数なので、char型変数に代入する書き方として正しいです。
これは文字を1つ扱う基本形です。

⑦ ○
%c は1文字を表示するための書式指定子です。
'Z' は文字定数なので、printf("%c\n", 'Z'); は適切です。

⑧ ×
%s は文字列を表示するための書式指定子です。
'Z' は文字定数(1文字)であり、文字列ではないため不適切です。文字列なら "Z" を使います。

⑨ ○
"A" は見た目では1文字に見えますが、C言語では文字列リテラルです。
内部的には A と \0 の並びとして扱われます。

⑩ ○
"Hi" は文字列リテラルなので、終端に \0 が付きます。
そのため、メモリ上のイメージは H、i、\0 です。

学習のコツ(つまずき防止)

文字定数と文字列リテラルは、最初のうちは混ざりやすいので、次のように覚えるとかなり楽になります。

  • シングルクォーテーションは1文字用
  • ダブルクォーテーションは文字列用
  • 文字列には最後に \0 が付く

この3つを意識しながらコードを見るだけでも、読み取り力がかなり上がります。
とくに printf の %c と %s の使い分けは、今後ずっと使う基本なので、ここでしっかり慣れておくのがおすすめです。