C/C++のデータ型と書式を知る:入力の書式
区切り文字を入力する
空白や改行など、通常はデータの区切りを表す文字を入力する方法は、以下に示すようにいくつかある。
区切り文字を変更する
データを区切る文字を空白などではないものにする方法だ。たとえば”%s,%s”とすれば、”abc def,ghi”を”abc def”と”ghi”という2つの値として入力することができる。
空白などでも入力可能な関数を用いる
他には、scanf()ではなく、たとえば1文字ずつ入力するgetchar()関数などを用いたり、ファイルから入力する方法もある。
書式中に入力可能な文字の種類を指定する
書式の中で、あらかじめ入力可能な文字を個別に、もしくは文字コードの範囲で示すこともできる。こうしておけば、大文字だけ、小文字だけといった指定も可能になる。次項で詳しく紹介しよう。
入力可能な文字の種類を指定する
書式中で入力可能な文字の種類を指定するのはスキャンセットと呼ばれるもので、[...]内に記述した文字を入力するというものと、[^...]内に記述した文字は入力しないという2つがある。
scanf( "%[abc]", a ); /* 'a', 'b', 'c'のいずれかが含まれれば入力する */
書式が”%[abc]”となっている場合は、先頭から’a’、’b’、’c’のいずれかが含まれる部分を入力する。たとえば”abcABC”は”abc”のみが入力される。”cba”はそのまま入力される。しかし”ABCabc”はうまく入力できない。
scanf( "%[^abc]", a ); /* 'a', 'b', 'c'以外なら入力する */
一方、書式が”%[^abc]”のような場合は、先頭から’a’、’b’、’c’以外の文字であれば入力できる。”ABCabc”であれば”ABC”のみが入力される。”def”はそのまま入力される。しかし”abcABC”はうまく入力できない。
スキャンセットには、[a-z]のように入力できる範囲を指定する方法もある。[a-zA-Z]というような指定も可能だ。ただし、これはC言語が誕生した当初(ANSI C)からあるものではなく、ISOで標準化されたものだ。
以下は、半角英数字と_(アンダースコア)を入力可能にする例だ。この場合は、”abcABC_012!#$%&'”は”abcABC_012”として入力される。
char a[21];
scanf( "%[a-zA-Z0-9_]", a ); /* "abcABC_012!#$%&'"は"abcABC_012"として入力 */
次回は入力に用いた変数と定数の記述方法について取り上げたい。
- コメント(3件)
>たとえば”%s,%s”とすれば、”abc def,ghi”を”abc def”と”ghi”という2つの値として入力することができる。
著した方はCをそれほどご存じないだけでなく、実際に試すこともしてらっしゃらないのでしょうか。
また、編集サイドでもフォローするどころかろくに校正もしてらっしゃらないのでしょうか。
他の記事でも修正中と称して間違いを堂堂と公開されているようですし、
安直にこの記事を鵜呑みにするような技術者にはなってはいけないという
反面教師を買って出てらっしゃるということなのでしょうか?
- ホワイトペーパー




どうしても scanf にこだわるのであれば、書式指定文字で size を制限しないとまずいでしょう。