こんにちは､ そしてお帰りなさい｡
新しいセクションに入りました｡
このセクションでは､ 文字列について説明します｡
授業中､ 私が文字列という言葉をかなり口にしたので､
少し戸惑ったかもしれませんね｡
文字列は､ 実際には単なる単語である｡
ダブルクォーテーションで囲まれたものです｡
今回は､ 文字列を文字配列に格納する方法について説明します｡
ここまでで､ 私たちは1つの文字､ charデータ型や「ケア」データ型など､
どのように発音してもよいということにかなり慣れました｡ それが何であるかは知っていますが､ 言葉についてはあまり学んでいません｡
char変数に1文字を代入する場合､ その文字は2つのシングルクォーテーションで囲まれます｡
私たちの身近にあるものです｡
私たちは､ このことを知り尽くしているのです｡
この例では､ プラス記号は一重引用符の中のプラスと同じです｡
そこで重要なのは､ シングルクォートです｡
また､ シングルクォートとダブルクォートの区別があることもお分かりいただけたと思います｡
つまり､ プラス記号の変数に二重引用符で何かを代入し､
プラス記号がchar型だった場合､ charデータ型には一文字しか代入できないので､
うまくいきません｡
文字列定数または文字列リテラルは､ 一対の二重引用符で囲まれた文字または記号のシーケンスです｡
だから今､ ダブルクォートは新しい遊びを提供しようとしているのです｡
これらの二重引用符で囲まれたものは､ コンパイラによって文字列として解釈されます｡
英数字や特殊文字も含まれますが､ 通常は単語を構成するもので､
テキストと同じように考えることができます｡
スペースがあってもいい｡
しかし､ 二重引用符で囲まれたものは､ 文字列リテラルです｡
printf関数を使ってメッセージを表示するたびに､
メッセージを文字列定数として定義してきました｡
printfを思い出してください｡ 最初の引数にはテキストを入力し､ いくつかの書式指定子があります｡
それは､ 文字列の子音です｡
ストリング・リテラルという言葉も聞きますが､ それと同じことです｡
つまり､ print fと言えば､ これは文字列で､ その二重引用符の間にあるものはすべて文字列定数で､
1行にも2行にも書くことができるのです｡
また､ エスケープシーケンスとしてバックスラッシュnを持つprint文があることにお気づきでしょうか｡
さて､
3つ目はとてもクールなもので､ 後で説明します｡
しかし､ ポイントは､ シングルクォートとダブルクォートの違いと､
その中身を理解しなければならないということです｡
ダブルクォートを使えば､ 文字列になります｡
シングルクォートで､ 文字がある｡
定数には2種類あります｡
3つ目の例では､ このprintfに4とバックスラッシュ､ そしてシングルクオートを記述しています｡
実際にシングルクォートを出力として表示する場合は､
それをエスケープする必要があります｡
また､ バックスラッシュを使用することで特殊文字をエスケープすることができます｡
つまり､ 3つ目の例では､ 実際にあなたが書いた4つのダブルクォートを印刷し､
さらに別のダブルクォートを印刷することになります｡
そのため､ コンパイラは､ バックスラッシュを先行させない明示的な二重引用符を文字列の区切りとして解釈しています｡
ダブルクォートを使うのは文字列の始まりと終わりだけど､ もしそれを表示したい場合は､
バックスラッシュを前に置くだけでいいんだ｡
そして､ コンパイラに､ これは実際には文字列を終了していないことを伝えるのです｡
表示したいもの､ そのキャラクターとして使いたいものです｡
また､ バックスラッシュはエスケープシーケンスなので､ バックスラッシュも行いたい場合は､
エスケープシーケンスを使用する必要があります｡
つまり､ バックスラッシュのバックスラッシュが表示されているときは､ 実はprintf関数でそのバックスラッシュを表示しているのです｡
他の場所で見かけたら､ バックスラッシュを変数に代入しているか､
どのように使われているかを確認します｡
しかし､ バックスラッシュそのものに続いて別のバックスラッシュがあると､ バックスラッシュの文字列がエスケープされます｡
そしてまた､ バックスラッシュと文字列は常にエスケープシーケンスの開始を告げるものである｡
だから､ 1つだけでは表示されないのです｡
これらは特殊文字です｡
そのため､ 二重引用符で囲んだときに､ 特殊文字をエスケープするためのバックスラッシュや､
バックスラッシュそのものが表示されることがあります｡
メモリ上の文字列はこんな感じです｡
メモリ上の文字列は､ 1文字1文字がここのビットで表現される｡
それで､ this is a stringという文字列があったとして､ スペースがメモリに何かを持っているところで見ることになりますね｡
また､ 最後にバックスラッシュ・ゼロがありますが､ これはこれから説明するヌル・ターミネータです｡
しかし､ 2つ目の文字列については､ やはりメモリにあるものをすべて見ることになります｡
改行を表すバックスラッシュnもメモリ内にある｡
そして､ 右のあなたには､ 引用文がメモリにあることにお気づきでしょう｡
しかし､ バックスラッシュはそうではありません｡
バックスラッシュが引用符を区切っているからです｡
引用を免れているのです｡
メモリ上ではこうなっているんですね｡
メモリ上の文字列は､ バックスラッシュゼロ（ヌル文字）のために､ 常に少なくとも1バイト以上あることに気づくはずです｡
また､ 底面の図も間違っているようです｡
ここでは「あなた」が表示されていないので､ 引用符のダブルクォートの後､ そこに「あなた」が表示されていないことに気づくでしょう｡
その下にASCII値が表示されているので､
それを表示しているだけです｡
そして､ 私が話したいのは､ このヌルキャラです｡
コード値ゼロの特殊文字です｡
これは各文字列の末尾に追加され､ コンパイラがどこで終わるのか､
また実行するときにわかるようにするためのものです｡
この文字はヌル文字と呼ばれ､ 単にゼロを入れるだけでなく､
バックスラッシュのゼロを入れることができます｡
そして､ この前のスライドの一番最後にあったのがこれです｡
そして､ それは実際にメモリの中のどこにでもある可能性があります｡
そして､ メモリ上のどこにあるかによって､ ある関数がバックスラッシュ・ゼロを見つけるまで探しに行き､
それを表示したり､ 別の文字列関数を使用している場合はそれを操作したりします｡
ヌルキャラは非常に重要です｡
文字列は常にヌル文字で終端される｡
つまり､ 文字列の長さは､ 常に文字列の文字数より1つ大きくなります｡
このことは､ 文字配列を使用する際に配列のサイズを指定する際に､
このヌル文字のために､ 配列のサイズを格納したい文字数よりも常に1つ多く指定しなければならないことを意味します｡
また､ これまであまり詳しく話していなかったのですが､ NULLという概念もあります｡
通常､ ポインタの話をするときに出てきますが､
NULL文字とNULLキーワードを混同しないようにしましょう｡
そこで､ includeヘッダーの1つにnullキーワードがあり､ それを利用することができます｡
そして､ これは何も参照しないメモリアドレスを表すシンボルです｡
つまり､ ポインターを使うときに使うわけですね｡
ヌル文字は､ 単なる文字列の終端です｡
nullについては､ ポインタの話をするときに詳しく説明しますが､ null文字とnullキーワードの区別を理解しておいてください｡
文字列の末尾にバックスラッシュ・ゼロを明示的に追加すると､
2つの文字列が作成されます｡ この方法については､ 文字配列の定義について説明するときに紹介します｡
以下は､ NULLターミネータを使った例です｡
ここにprint fがあり､ その文字と､ 文字列を終了させるバックスラッシュゼロを言うのです｡
つまり､ このプログラムをコンパイルして実行すると､
最初の行に文字が表示され､
バックスラッシュのoで終了し､ 文字列の最初の部分だけが表示されることになります｡
printが文字列の終わりと勘違いしているので､ これ以上出力されないでしょう｡
つまり､ 文字をプリントアウトするだけなのです｡
この関数はヌル文字に到達すると出力を停止するため､
この最初の2語の後に出力が終了します｡
つまり､ 文字列の終わりのダブルクォートの直前､
文字列のドットの直後にはバックスラッシュゼロが表示されませんが､
まだ1つ存在します｡
そのため､ 文字列とprintfの終わりには暗黙のうちにヌル終端記号があり､ どこで終わるのかがわかるようになっています｡
また､ もう1つ追加しても､ その最初の1つまでしか表示されないんです｡
ですから､ 文字列の中で最初に見つかったヌル文字は､ 常に文字列の終わりを意味します｡
だから､ これらのヌル文字を理解してください｡
これは､ 文字列とは何かを説明し､ 文字列が二重引用符で囲まれていることを理解するための簡単な概要でした｡
そして､ ヌル文字も表現したい｡
次回の講義では､ 文字列を格納するために､ これらの異なるこの1種類の変数をどのように作成するかという観点から､
文字列とは何かを理解します｡
ありがとうございます｡