C/C++のデータ型と書式を知る:入力の書式
沖林正紀
2008-02-27 08:00:00
データ入力の書式はほとんど出力の場合と同じだが、少しだけ異なるところもある。
データを入力する関数
まず、データを入力するときに用いるscanf()関数について紹介しておきたい。これはキーボードなどの標準入力からデータの入力を受け付ける。この中で前回紹介したような書式を表す文字列を用いる。
キーボードから半角10文字までの文字列を入出力する例を以下に示す。
#include
..........
char a[11]; /* 半角10文字分の文字列を保持する変数(配列) */
scanf( "%s", a ); /* 変数aに文字列を入力 */
printf( "%s\n", a ); /* 変数aの値を出力 */
まず、データを入力するには、入力されたものをプログラム内で保持しておくために変数が必要だ。scanf()関数は、書式にしたがって入力したデータを変数に代入して保持させる。戻り値は代入した値の数だが、うまく入力ができなかったときはEOFという特別な値となる。
複数の値の入力
複数の値を入力する場合は、データを保持する変数も複数必要だ。たとえば半角10文字までの文字列を入出力する場合の例を以下に示す。
char a[11], b[11]; /* 半角10文字分の文字列を保持する変数(配列) */
scanf( "%s %s", a, b ); /* 変数a, bに文字列を入力 */
printf( "%s %s\n", a, b ); /* 変数a, bの値を出力 */
出力の書式で”%s %s”と記述されているときは、2つの文字列の間に1つの半角空白が出力される。しかし、入力の書式におけるこの空白は、データの区切りを意味する。具体的には、空白以外に改行やタブ(Tab)でもよい。改行やタブもASCIIコードに含まれる、れっきとした文字の一種(制御文字)であることを思い出してほしい。
また、2つの文字列の間に入るこれらの区切りは、複数で連続している場合、それを書式上の1つの区切りとする。そのため、これらも文字列の一部として入力したい場合は、別の方法が必要となる。
- コメント(3件)
#1
ちゃっぴ
2008-03-29 22:46:16
#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をそれほどご存じないだけでなく、実際に試すこともしてらっしゃらないのでしょうか。
また、編集サイドでもフォローするどころかろくに校正もしてらっしゃらないのでしょうか。
他の記事でも修正中と称して間違いを堂堂と公開されているようですし、
安直にこの記事を鵜呑みにするような技術者にはなってはいけないという
反面教師を買って出てらっしゃるということなのでしょうか?
>たとえば”%s,%s”とすれば、”abc def,ghi”を”abc def”と”ghi”という2つの値として入力することができる。
著した方はCをそれほどご存じないだけでなく、実際に試すこともしてらっしゃらないのでしょうか。
また、編集サイドでもフォローするどころかろくに校正もしてらっしゃらないのでしょうか。
他の記事でも修正中と称して間違いを堂堂と公開されているようですし、
安直にこの記事を鵜呑みにするような技術者にはなってはいけないという
反面教師を買って出てらっしゃるということなのでしょうか?
- ホワイトペーパー


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