文字の並びを二重引用符("
〜"
)で囲んだもの。
内部的にはchar
型の配列として表現される。
ただし、末尾に終わりを表すためにナル(ヌル)文字(\0
)が自動的に付加される。
補足: 文字列リテラルの途中にナル文字(\0
)を入れても良いが、
ほとんどの文字列を扱う関数はナル文字を文字列の終わりと考えるので、
普通はそんなことはしない。
("AB\0CD"
と書いても"AB"
のように扱われる。)
復習: 文字列リテラル中に二重引用符("
)を入れる場合は、
\"
という拡張表記を用いる。
\0
)'\0'
(ASCIIコード 0)と'0'
(ASCIIコード 48)は全く異なるものである。)
C言語では文字列は文字(char
)型の配列で、終わりをナル文字で表したものである
(List 9-2)。
文字列をprintf
で出力するための変換指定は%s
である。
char str[4] = {'A', 'B', 'C', '\0'}; /* 要素数の 4は省略可能 */ /* または */ char str[4] = "ABC"; /* 要素数の 4は省略可能 (ただし 3ではないことに注意する) */
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", …)
というかたちで、
文字列を読み込むことがある。
toupper
関数、tolower
関数を利用することができる。
(List 9-13)