第5章 標準入出力関数(1)

標準入力(キーボードからの入力)、標準出力(画面への出力)を行う標準ライブラリ関数のうち、特に使用頻度の高い、printf() と scanf() について説明します。

尚、その他の標準入出力関数については 第8章 をご参照下さい。

標準入出力関数を使用するには、#include <stdio.h> が必要です。

「#include」については「18-2.#include」を参照してください。


5−1.printf()

画面に書式付きで出力します。

printf() の f は "format"(書式) の f です。printf()は書式指定を行うことにより、同じ「65」という数値でも、10進数で出力したり、文字で出力したりというように出力形式を変えることが出来ます。

(書き方)

printf( 書式文字列, 可変個引数 );

(1)書式文字列

""で囲まれた文字列

【1. 変換指定文字列】

% ではじまり、出力データの変換形式を指定します。

尚、「%」を文字として表現するには「%%」と記述します。

【printf の変換指定文字】
変換指定文字意味使われるデータ型
%c1文字として出力する文字型
%d10進数で出力する整数型
%x16進数で出力する
%o8進数で出力する
%f[-]dddd.ddddddの形式で出力する浮動小数点型
%e指数形式で出力する
%s文字列として出力する文字列

※long型表記に対する出力の場合は、変換指定子の前に変換修飾子l(エル)を付加し、"%ld"のように記述します。

(例)
double data = 0.0123;

printf("%f %e", data, data);

【2. エスケープシーケンス(拡張表記)】

\ ではじまります。通常の方法で表現できない文字を \ を先頭に付けることにより出力することが出来ます。

【代表的なエスケープシーケンス】
エスケープシーケンス意味ASCIIコード(16進)
\n復帰改行0A
\a警報音07
\tタブコード09
\bバックスペース08
\\文字としての \5C
\'文字としての '2C
\"文字としての "22
\0文字列終了コード0
\ はエスケープシーケンスの始まりを示し、" は文字列、' は文字の始まりと終わりを示します。
そのため、これらの文字が文字列中に現れると、printf()は特別な意味を表す記号なのか単なる文字なのかの
区別がつかなくなります。
ですから、これらの文字を文字として認識させるために 「\」 を付けて、「\\」、「\"」、「\'」と記述します。
(例)
printf("error!!\n\a");

【3. 一般文字列】

変換指定文字列、エスケープシーケンス以外の文字列です。記述された文字列がそのまま出力されます。

(例)
printf("Hello!\n");

(2)可変個引数

引数については第11章 関数で詳しく説明しますが、関数に渡される値をこう呼びます。 「可変個」というのは、個数が変わるという意味です。通常、引数の個数は関数によって決まっているものですが、printfは少々特殊な関数で、引数の個数が変わります。 ここには、変数や定数、式などを記述します。

【1. 出力データの無い場合】

"" で囲まれた文字列のみを出力します。可変個引数は不要です。

(例)
printf("今日は、いいお天気ですね。\n");

【2. 1個以上の出力データがある場合】

出力形式を変換指定文字列で指示します。1つの引数をいろいろな形式で出力したい場合には変換指定文字列の数だけ引数が必要になりますので注意してください。変換指定文字列と引数は左側から順に対応します。

(例)
サンプル 演習

5−2.printf()の表示を整える

printf関数では表示の見栄えを良くするために%と変換指定子との間に次の指定子を入れることができます。

【1. フラグ】

  1. - : 左詰めに表示する(省略時には右詰め)
  2. + : 符号を付ける(省略時には "-" 符号のみ)
  3. # : 数値の表記形式がわかるように表示する
  4. %o のとき : 数字の前に "0" を付加する   
    %x のとき : 数字の前に "0x" を付加する
  5. 0 : 0 を詰める
(例)
int	a = 12, b = 58;
char	str1[] = "Hello";
char	str2[] = "world";

printf("右詰め:%10s%10s\n", str1, str2);
printf("左詰め:%-10s%-10s\n", str1, str2);
printf("符号あり:%+d\n", a);
printf(" 8進表示:%#o\n", b);
printf("16進表示:%#x\n", b);
(実行結果)
右詰め:     Hello     world	指定がないと10文字分右詰めで表示
左詰め:Hello     world     	10文字分左詰めで表示
符号あり:+12			+ の符号を付加
 8進表示:072			先頭に0を付加
16進表示:0x3a			先頭に0xを付加

【2. フィールド幅】

数値の出力幅を指定します。

(例)
int data = 123;

printf("%d\n", data);
printf("%5d\n", data);
printf("%10d\n", data);
printf("%2d\n", data);
printf("%05d\n", data);
(実行結果)


123		指定なしのとき
..123		スペース含めて 5文字
.......123	スペース含めて 10文字
123		指定が小さい場合は必要幅
00123		0フラグがあると0を詰める

【3. 精度】

浮動小数点数の小数点以下の桁数を指定します。

(例)
double x = 654.321;

printf("%f\n", x);
printf("%12f\n", x);
printf("%9.2f\n", x);
(実行結果)


654.321000	指定なしのとき
..654.321000	小数点を入れて 12桁(小数点以下の桁は標準値)
...654.32		小数点を入れて 9桁(小数点以下 2桁)
演習

5−3.scanf()

キーボードから書式付きで入力します。

scanf() の f は "format"(書式) の f です。scanf() は printf() と同様に書式指定を行うことにより、「A」のキーを押しても、16進数で入力したり、文字で入力したりというように入力形式を変えることが出来ます。

(書き方)

scanf( 書式指定文字列, 格納可変個引数 );

(1)書式指定文字列

"" で囲まれた文字列

【scanf の変換指定文字】
変換指定文字意味使われるデータ型
%c1文字として入力する文字型
%d10進数で入力する整数型
%x16進数で入力する
%o8進数で入力する
%f浮動小数点数を入力する浮動小数点型
%s文字列を入力する文字型配列

  ※double型の入力は、変換指定子fの前に変換修飾子l(エル)を付加し、"%lf" と表記します。変換修飾子l(エル)を忘れがちですので、注意してください。
  ※long型の入力は、変換指定子の前に変換修飾子l(エル)を付加し、"%ld" のように表記します。

(2)格納可変個引数

入力データを格納する領域のアドレス(アドレスについてはポインタの章で詳しく説明します。)を指定します。

【1. 変数にキーボードからデータを入力】

変数のアドレスを「&変数名」で記述します。

【2. 文字型配列にキーボードから文字列を入力】

配列の先頭要素のアドレスを「配列名」で記述します。「&」は不要です。

サンプル

5−4.scanf()の注意事項

(1)空白類(スペース、改行、タブなど)は読み込まない

scanf() の "%s" 変換では空白類がくると読み込みを終了します。そのため、

This is a pen.

といった文字列を読み込むことはできません。

この例では「This」だけが読み込まれます。 (空白類を含む文字列を読み込むときには gets() を用います。 gets() については「標準入出力関数(2)」の章で説明します。)

(2)改行文字が残る

キーボードから入力された文字はバッファと呼ばれる作業領域にいったん読み込まれ、エンターキーが入力されるとフラッシュ(バッファをクリアし、再びバッファリングが行える状態にすること)されます。

scanf() では、正しく入力しても最後の改行文字はバッファの中に残るため、おかしな動作になるときがあります。(scanf() 実行後に、scanf() の "%c" 変換を行ったとき)

(回避方法)

いくつか方法はありますが、

scanf("%*c%c", &c);
    ↑ 改行の読み捨て
または、
scanf(" %c", &c);
    ↑ 空白(改行含む)を読み飛ばす。
       ただし、空白類文字を入力したいときにはこの方法は使えません。

と記述し、改行を読み捨ててしまいましょう。

(3)読み込み不一致

変換指定文字列で、期待していなかったデータを入力すると、 バッファのデータをそのまま残し、動作を終了してしまいます。

 正しく入力できるように、printf() で入力ガイダンスを表示しましょう。
また、回避方法は「標準ライブラリ関数」の章で説明します。
演習
◆◆前ページ  ▲TOP▲  次ページ◆◆

banner
「初心者のためのポイント学習C言語」
Copyright(c) 2000-2004 TOMOJI All Rights Reserved