C/C++のデータ型と書式を知る:入力の書式

沖林正紀
2008-02-27 08:00:00
  • このエントリーをはてなブックマークに追加

区切り文字を入力する

 空白や改行など、通常はデータの区切りを表す文字を入力する方法は、以下に示すようにいくつかある。

区切り文字を変更する

 データを区切る文字を空白などではないものにする方法だ。たとえば”%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件)
#1 ちゃっぴ   2008-03-29 22:46:16
scanf を教える必要があるでしょうか?より、現実的な fgets, sscanf を教えるべきでは?
どうしても scanf にこだわるのであれば、書式指定文字で size を制限しないとまずいでしょう。
#2 はつね   2008-04-01 21:56:36
入力の書式ということでscanfを取り上げるのであれば、char a[11];に対する"%10s"を説明しなければならないと思います。また、それを指定しせずに10文字以上入力した場合にどのような振る舞いが発生するかにも言及すべきでしょう。
#3 性悪狐   2008-04-01 23:38:04
他の方のコメントの内容も当然のことなのですが、こんな大嘘を書いてはいけませんね。
>たとえば”%s,%s”とすれば、”abc def,ghi”を”abc def”と”ghi”という2つの値として入力することができる。

著した方はCをそれほどご存じないだけでなく、実際に試すこともしてらっしゃらないのでしょうか。
また、編集サイドでもフォローするどころかろくに校正もしてらっしゃらないのでしょうか。
他の記事でも修正中と称して間違いを堂堂と公開されているようですし、
安直にこの記事を鵜呑みにするような技術者にはなってはいけないという
反面教師を買って出てらっしゃるということなのでしょうか?
このサイトでは、利用状況の把握や広告配信などのために、Cookieなどを使用してアクセスデータを取得・利用しています。 これ以降ページを遷移した場合、Cookieなどの設定や使用に同意したことになります。
Cookieなどの設定や使用の詳細、オプトアウトについては詳細をご覧ください。
[ 閉じる ]