C言語のきほん|C言語のエスケープシーケンス

見えない文字を使いこなすと、表示がぐっと整う。エスケープシーケンスでC言語の表現力を広げよう。

C言語で画面に文字を表示していると、ただ文字を並べるだけでは足りない場面がすぐに出てきます。
たとえば、改行したい、タブでそろえたい、ダブルクォーテーションそのものを表示したい、という場面です。

そんなときに使うのが エスケープシーケンス です。
エスケープシーケンスは、見た目では普通の文字列の中に書きますが、C言語の中では特別な意味を持つ記号として扱われます。

この仕組みを理解すると、printf での表示がとても扱いやすくなります。
逆にここをあいまいにしたままだと、改行されない、記号がうまく表示できない、文字列の終わり方がおかしい、といったつまずきが起きやすくなります。

ここでは、C言語のエスケープシーケンスの基本を、よく使うものを中心にやさしく整理していきます。
サンプルプログラムも、見やすい別の例に置き換えて説明するので、ひとつずつ確認しながら進めていきましょう。

エスケープシーケンスとは

エスケープシーケンスは、文字列の中で特別な文字や動作を表す書き方 です。
バックスラッシュから始まるのが特徴で、続く文字によって意味が決まります。

たとえば、次のようなものがあります。

  • \n ・・・改行
  • \t ・・・タブ
  • \ ・・・バックスラッシュそのもの
  • " ・・・ダブルクォーテーションそのもの

文字列の中では普通の文字として書けないものや、目に見えない制御文字を扱うために使います。

イメージでつかむ

よく使うエスケープシーケンス

まずは、よく使うものを表でまとめて見ておきましょう。
ここはよく使うので、少しずつ慣れていくとかなり楽になります。

表記意味説明
\n改行次の行の先頭に移動する
\tタブ横方向の空きを入れる
\バックスラッシュバックスラッシュそのものを表示する
"ダブルクォーテーションダブルクォーテーションを表示する
'シングルクォーテーションシングルクォーテーションを表示する
\0ナル文字文字列の終端を表す特別な文字

ここでのポイントは、見た目は2文字でも、意味としては1つの特殊な文字や動作 だということです。
特に \n と \t は、printf でとてもよく使います。

なぜそのまま書けないのか

たとえば、文字列はダブルクォーテーションで囲みますよね。

printf("こんにちは");

この中でダブルクォーテーションそのものを表示したいとき、ただ " を書いてしまうと、C言語は「ここで文字列が終わった」と解釈してしまいます。
そこで、" のようにエスケープして「これは文字列の終わりではなく、文字としての " です」と伝える必要があります。

バックスラッシュも同じです。
バックスラッシュはエスケープシーケンスの開始記号なので、文字として表示したいときは \ と書きます。

まずは改行を表す \n をしっかり理解する

エスケープシーケンスの中でも、最初にしっかり覚えたいのが \n です。
これは改行を意味します。

例:

printf("1行目\n2行目\n");

実行結果はこうなります。

1行目
2行目

もし \n がなければ、表示はつながってしまいます。
printf を複数回使うときも、どこで改行するかは自分で指定する必要があります。

タブを表す \t の使い方

\t はタブを表します。
表のように項目を並べたいときに便利です。

例:

printf("名前\t点数\n");
printf("佐藤\t85\n");
printf("田中\t92\n");

実行結果のイメージはこんな感じです。

名前    点数
佐藤    85
田中    92

タブは「一定の位置まで空ける」動きなので、文字数によって見え方が少し変わることがあります。
きれいに列をそろえたい場面では、あとで学ぶ表示幅指定もよく使いますが、最初は \t で十分です。

バックスラッシュを表示する \

Windowsのパスのように、バックスラッシュを含む文字列を表示したいことがあります。

たとえば次のようなパスです。

C:\Users\Taro\Documents

これをC言語の文字列でそのまま書くと、\U や \D の部分がエスケープシーケンスのように解釈される可能性があり、意図通りになりません。
そのため、バックスラッシュは \ と書きます。

例:

printf("保存先: C:\\Users\\Taro\\Documents\n");

ダブルクォーテーションを表示する "

文字列の中で " を表示したいときは " を使います。
これはかなりよく使います。

例:

printf("\"C言語\"の練習をしています\n");

実行結果はこうなります。

"C言語"の練習をしています

シングルクォーテーションを表示する '

シングルクォーテーションも、必要ならエスケープして書けます。

例:

printf("記号の例: \'A\'\n");

実行結果

記号の例: 'A'

文字列の中ではシングルクォーテーションはそのまま書ける場面も多いですが、エスケープ表記として覚えておくと安心です。

ナル文字 \0 について

\0 はナル文字で、文字列の終わりを表す特別な文字 です。
これは画面に見える文字ではありません。

C言語の文字列は、内部的には最後に \0 が付くことで終端を判断しています。

たとえば "ABC" は、内部では次のようなイメージです。

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

この \0 があるからこそ、C言語は「ここまでが文字列」と判断できます。
printf で普段意識することは少ないですが、文字列の仕組みを理解するうえでとても大事です。

サンプルプログラムでまとめて確認する

ファイル名:5_2_1.c

#include <stdio.h>

int main(void)
{
    /* タブを使って項目をそろえて表示する */
    printf("項目\t値\n");
    printf("気温\t28\n");

    /* バックスラッシュを表示する */
    printf("保存先は C:\\Temp\\memo.txt です\n");

    /* ダブルクォーテーションを表示する */
    printf("\"エスケープシーケンス\"を練習中です\n");

    /* 改行を使って空行を入れる */
    printf("ここで1行空けます\n\n");
    printf("次の行を表示しました\n");

    return 0;
}

実行結果例

項目    値
気温    28
保存先は C:\Temp\memo.txt です
"エスケープシーケンス"を練習中です
ここで1行空けます

次の行を表示しました

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

\t で見た目を整える

printf("項目\t値\n");
printf("気温\t28\n");

\t を使うことで、表示を横方向にそろえやすくなります。
簡単な一覧表示を作るときに便利です。

\ でバックスラッシュを表示する

printf("保存先は C:\\Temp\\memo.txt です\n");

バックスラッシュを1文字表示したいときは、コード上では \ と2つ書きます。
ここは最初に混乱しやすいですが、エスケープの開始記号だから2つ必要、と覚えるとわかりやすいです。

" で文字列中にダブルクォーテーションを入れる

printf("\"エスケープシーケンス\"を練習中です\n");

文字列の開始・終了に使う記号を文字として表示したいので、" を使っています。
この書き方は説明文を表示するときによく出てきます。

\n を2回書くと空行になる

printf("ここで1行空けます\n\n");

\n を2回続けると、1回改行して次の行へ、さらにもう1回改行するので、結果として空行が入ります。
表示を読みやすくしたいときによく使うテクニックです。

エスケープシーケンスの読み方に慣れるコツ

最初は、文字列の中に \ が並ぶと少し読みにくく感じるかもしれません。
そんなときは、次のように区切って読むとわかりやすいです。

たとえば、

printf("C:\\Temp\\memo.txt\n");

は、頭の中でこんなふうに分けて読むと理解しやすくなります。

  • C:
  • \ で \ を表示
  • Temp
  • \ で \ を表示
  • memo.txt
  • \n で改行

慣れてくると、見た瞬間に意味が読めるようになります。

よくあるミスと注意点

バックスラッシュを1つだけ書いてしまう

たとえば Windows のパスをそのまま書いてしまうと、意図しないエスケープシーケンスとして解釈されることがあります。

printf("C:\Temp\memo.txt\n");

このような書き方は危険です。
バックスラッシュは必ず \ と書くようにしましょう。

文字列の中の " をそのまま書いてしまう

次のように書くと、文字列が途中で終わったと解釈されてしまいます。

printf(""C言語"を学ぶ\n");

ダブルクォーテーションを表示したいときは、" を使います。

printf("\"C言語\"を学ぶ\n");

\n を忘れて表示がつながる

printf を何回も書いているのに、表示が1行につながってしまうのは \n の付け忘れが原因のことが多いです。
表示の見た目が変だなと思ったら、まず改行の位置を確認すると解決しやすいです。

エスケープシーケンスと文字列の学習はセットで進む

エスケープシーケンスは、printf のためだけの知識ではありません。
文字列を扱う場面全体でずっと使います。

これから先、ファイルパス、メッセージ表示、文字列処理、文字コードの学習などでも何度も出てきます。
特に次の3つは最優先で使えるようにしておくと安心です。

  • \n(改行)
  • \t(タブ)
  • \ と "(特殊記号の表示)

このあたりに慣れてくると、表示のレイアウトを自分で整えられるようになって、コードを書くのがかなり楽しくなります。