エスケープシーケンスとは「特殊な文字」のことです。
C言語の「特殊な文字」は「\」から始まります。
これまでも使ってきましたので、あれか!と思った人もいると思います。
printfで使っていた「\n」(改行)もエスケープシーケンスの1つです。
他にどのようなものがあるか書き出してみます。
<表1:エスケープシーケンス抜粋>
\a | alarm | アラーム |
\b | backspace | バックスペース |
\f | formfeed | 改ページ |
\n | newline | 改行 |
\r | carriage return | 復帰 |
\t | horizontal tab | 水平タブ |
\t | virtical tab | 垂直タブ |
\\ | yen mark | 円記号 |
\' | single quotation | 単一引用符 |
\" | double quotation | 二重引用符 |
\? | question mark | 疑問符 |
\0 | null | ヌル文字 |
改行以外は使ったことが無いですので、色々試してみましょう。
まずは「\a」から試しましょう。
アラームと書いてありますので、音が出るよう設定してから実行してください。
<sample program col026-01>
#include <stdio.h> int main(void) { printf("\a"); return 0; } |
<実行結果>
続行するには何かキーを押してください・・・
何か音が鳴りましたか?
私のOSはWindows8ですが、皆さんと環境が異なるかもしれません。
この環境では、システムに設定されている「システムエラー」の音が流れました。
次は「\b」を試します。
<sample program col026-02>
#include <stdio.h> int main(void) { printf("ABC\b"); return 0; } |
<実行結果>
AB続行するには何かキーを押してください・・・
"ABC"と表示されるはずが"AB"しか表示されていません。
「\b」はバックスペースですから'C'は消去されたのです。
次は「\f」ですね。
<sample program col026-03>
#include <stdio.h> int main(void) { printf("ABC\f"); return 0; } |
<実行結果>
ABC 続行するには何かキーを押してください・・・
私の環境では、半角の空白が出てきました。
「\f」は改ページですから、プリンターなどの機器に対して実行すればきちんと動作すると思います。
しかし、ディスプレイに対しては改ページ処理はされないようです。
次は「\n」を飛ばして「\r」を試します。
<sample program col026-04>
#include <stdio.h> int main(void) { printf("ABC\r"); return 0; } |
<実行結果>
続行するには何かキーを押してください・・・
一見何も表示されていないように見えますが、「\r」は復帰です。
私の環境では、その行の先頭に戻るという意味になっています。
上のプログラムでは、"ABC"が表示された後で、カーソル位置が先頭に戻り、"続行するには・・・という文字が表示されたため、"ABC"が消えてしまったのです。
※環境によっては「\r」で改行するケースも考えられます。
次は「\t」です。
水平タブは「インデント」でも使いますから馴染みがあると思います。
<sample program col026-05>
#include <stdio.h> int main(void) { printf("ABC\tDEF"); return 0; } |
<実行結果>
ABC DEF続行するには何かキーを押してください・・・
「\t」と書いた箇所に水平タブが入っています。
次の「\v」はプリンターなどの機器用のため、例は書きません。
「\\」から「\?」までは「\」の右側にある文字を表示するためにあります。
一つだけ例を書きましょう。
次のプログラムを実行してみてください。
<sample program col026-06>
#include <stdio.h> int main(void) { printf("\1,000"); return 0; } |
<実行結果>
「\1,000」と表示したかったのですが、私の環境では「訳のわからない文字」が表示されました。
「\」はエスケープシーケンスの開始を表す文字ですので、後ろに続く文字によって様々な動作をします。
「\」そのものを表示したい場合は「\\」と書かなければなりません。
<sample program col026-06>
#include <stdio.h> int main(void) { printf("\\1,000"); return 0; } |
<実行結果>
\1,000続行するには何かキーを押してください・・・
さて、最後が「文字列」を勉強する上で一番重要な「\0」ヌル文字です。
ヌル文字は文字列の最後を表します。
「文字列」の初期値を設定したり、scanfで入力すると「文字列」の最後に自動的にヌル文字を入れてくれます。
前回の説明では、ヌル文字は「数値」のゼロでしたよね?
「\0」も「数値」で表すとゼロです。
少し段階を追って説明します。
まずは次のプログラムを組んで実行します。
文字列用配列に初期値"ABC\n"を入れて、1文字ずつ「数値」として表示します。
<sample program col026-07>
#include <stdio.h> #define MAX_STRING 10 int main(void) { char str[MAX_STRING] = "ABC\n"; int i; for (i = 0; i < MAX_STRING; i++) { printf("%d\n", str[i]); } return 0; } |
<実行結果>
65 66 67 10 0 0 0 0 0 0 続行するには何かキーを押してください・・・
'C'である67の下に10と表示されています。
文字コード表で「10進数」の10に当たる文字は「LF」です。
「LF」はラインフィードと言って、簡単に言うと「次の行へ進む」です。
「改行コード」については環境によって変わるため、一言では説明し辛いですが、ここで言いたいのは「改行コード」のことではありません。
文字列に設定した「\n」は文字数を単純に考えると2文字分あるように見えますが、「LF」1文字分しかデータはありません。
表1にある文字は1文字として扱われます。
配列のイメージで書くと↓のような感じです。
str 0 1 2 3 4 5 6 7 8 9 +−+−+−+−+−+−+−+−+−+−+ | A| B| C|\n|\0|\0|\0|\0|\0|\0| +−+−+−+−+−+−+−+−+−+−+
「改行」も「ヌル文字」も1文字として扱われます。
これを踏まえた上で、文字列の最後に「ヌル文字」が無かったらどうなるか試します。
文字列の初期値を設定したり、scanfで入力すると自動的に「ヌル文字」が設定されると書きました。
自動的に「ヌル文字」を設定させないため、次のように組んだプログラムを実行してみてください。
<sample program col026-08>
#include <stdio.h> #define MAX_STRING 10 int main(void) { char str[MAX_STRING]; int i; str[0] = 'A'; str[1] = 'B'; str[2] = 'C'; for (i = 0; i < MAX_STRING; i++) { printf("%d\n", str[i]); } return 0; } |
<実行結果>
65 66 67 -52 -52 -52 -52 -52 -52 -52 続行するには何かキーを押してください・・・
1文字ずつ配列の要素に代入することで、自動的に「ヌル文字」が設定されることを防ぎました。
'C'を表す67の後ろに「ヌル文字」を表す0がありません。
-52はカタカナの'フ'でしたね。
これをprintfの%sで表示してみましょう。
<sample program col026-09>
#include <stdio.h> #define MAX_STRING 10 int main(void) { char str[MAX_STRING]; str[0] = 'A'; str[1] = 'B'; str[2] = 'C'; printf("%s\n", str); return 0; } |
<実行結果>
最初の'A'、'B'、'C'とそれに続く'フ'は分かると思いますが、全部で10文字以上表示されている上によく分からない文字も表示されています。
これが何を示しているかというと、
printfで文字列を表示する場合、「ヌル文字」がなければ見つかるまで表示を続けている
と言うことです。
今回はたまたまどこかで「ヌル文字」が見つかったため、ここで表示をやめましたが、「ヌル文字」が見つからなければ延々と表示を続けているでしょう。
先ほどのプログラムに自分で「ヌル文字」を設定してみましょう。
「ヌル文字」も1文字ですから’(シングルクォーテーション)で囲んで記述します。
<sample program col026-10>
#include <stdio.h> #define MAX_STRING 10 int main(void) { char str[MAX_STRING]; str[0] = 'A'; str[1] = 'B'; str[2] = 'C'; str[3] = '\0'; printf("%s\n", str); return 0; } |
<実行結果>
ABC 続行するには何かキーを押してください・・・
プログラムによっては上記のように「ヌル文字」を自分で設定しなければならないケースもあります。
改めて、C言語の文字列を扱う際には「ヌル文字」の存在を忘れないようにしましょう。
ブラウザの戻るボタンで戻ってください。