12月 7日


第9章

文字列リテラル
教科書 p.208

文字の並びを二重引用符("")で囲んだもの。

内部的にはchar型の配列として表現される。 ただし、末尾に終わりを表すためにナル(ヌル)文字(\0)が自動的に付加される。

補足: 文字列リテラルの途中にナル文字(\0)を入れても良いが、 ほとんどの文字列を扱う関数はナル文字を文字列の終わりと考えるので、 普通はそんなことはしない。
"AB\0CD"と書いても"AB"のように扱われる。)

復習: 文字列リテラル中に二重引用符(")を入れる場合は、 \"という拡張表記を用いる。

ナル(ヌル)文字(\0
教科書 p.208
0という値を持つ文字のこと。 ('\0'(ASCIIコード 0)と'0'(ASCIIコード 48)は全く異なるものである。)
文字列
教科書 p.210

C言語では文字列は文字(char)型の配列で、終わりをナル文字で表したものである (List 9-2)。

文字列をprintfで出力するための変換指定は%sである。

文字配列の初期化
教科書 p.211
文字列を格納する配列は次のように初期化できる (List 9-3)。
    char str[4] = {'A', 'B', 'C', '\0'};  /* 要素数の 4は省略可能 */
/* または */
    char str[4] = "ABC";                  /* 要素数の 4は省略可能 (ただし 3ではないことに注意する) */
文字列の読み込み
教科書 p.212

scanfの変換指定には%sを用い、 読み込む配列には&付けずに渡す。 (List 9-4)。

    chr str[40];
    printf("文字列を入力して下さい: "); scanf("%s", str);

注意:  実用的なプログラムでは文字列を入力するために、 scanfを使用するのは推奨できない。 予測よりも長い文字列を入力されると、プログラムが暴走する可能性がある。 これはバッファオーバーフローというセキュリティホールになる。 この問題を回避するためにfgetsという関数を使うことが多い (fgetstest.c)。

例えば上の例で scanf("%s", str);の代わりに fgets(str, 40, stdin);とすると、 最大39(=40-1)文字まで (もしくは改行文字まで)読み込んで最後にナル文字を追加する。

一般に、fgetsの第1引数は文字列を読み込む先のcharの配列で、 第2引数は最大読み込む文字数+1、 第3引数は読み込む元である。上の例では標準入力(stdin) を指定しているが、ファイルなどからも読み込むことができる。

この方式は安全だが、大抵の場合、最後に読み込まれる改行文字を取り除く必要があるので、 ちょっとだけ面倒である。(改行文字を取り除くには、 通常、sscanfという関数を使う。) このため以下では、 あくまでも練習用と割り切ってscanf("%s", …)というかたちで、 文字列を読み込むことがある。

文字列の配列
教科書 p.214
もちろん、文字列の配列をつくることも可能である。 List 9-6の文字列の配列は Fig.9-5のように格納される。
(空いている後ろの部分は ナル文字で初期化される。)
文字列の操作
教科書 p.216
文字列を扱う典型的なプログラム ― List 9-8, List 9-9, List 9-10, ― ナル文字が出現するまでループする。
大文字・小文字の変換
教科書 p.222
大文字・小文字の変換には、ctype.hというヘッダファイルで宣言されている toupper関数、tolower関数を利用することができる。 (List 9-13
(ctype.hには文字のテスト・変換に使用できる関数がいくつか用意されている。)

戻る


Koji Kagawa(kagawa@eng.〜)