標準入力(キーボードからの入力)、標準出力(画面への出力)を行う標準ライブラリ関数のうち、特に使用頻度の高い、printf() と scanf() について説明します。
尚、その他の標準入出力関数については 第8章 をご参照下さい。
標準入出力関数を使用するには、#include <stdio.h> が必要です。
「#include」については「18-2.#include」を参照してください。
画面に書式付きで出力します。
printf() の f は "format"(書式) の f です。printf()は書式指定を行うことにより、同じ「65」という数値でも、10進数で出力したり、文字で出力したりというように出力形式を変えることが出来ます。
printf( 書式文字列, 可変個引数 );
% ではじまり、出力データの変換形式を指定します。
尚、「%」を文字として表現するには「%%」と記述します。
変換指定文字 | 意味 | 使われるデータ型 |
---|---|---|
%c | 1文字として出力する | 文字型 |
%d | 10進数で出力する | 整数型 |
%x | 16進数で出力する | |
%o | 8進数で出力する | |
%f | [-]dddd.ddddddの形式で出力する | 浮動小数点型 |
%e | 指数形式で出力する | |
%s | 文字列として出力する | 文字列 |
※long型表記に対する出力の場合は、変換指定子の前に変換修飾子l(エル)を付加し、"%ld"のように記述します。
double data = 0.0123; printf("%f %e", data, data); |
\ ではじまります。通常の方法で表現できない文字を \ を先頭に付けることにより出力することが出来ます。
エスケープシーケンス | 意味 | ASCIIコード(16進) |
---|---|---|
\n | 復帰改行 | 0A |
\a | 警報音 | 07 |
\t | タブコード | 09 |
\b | バックスペース | 08 |
\\ | 文字としての \ | 5C |
\' | 文字としての ' | 2C |
\" | 文字としての " | 22 |
\0 | 文字列終了コード | 0 |
\ はエスケープシーケンスの始まりを示し、" は文字列、' は文字の始まりと終わりを示します。 そのため、これらの文字が文字列中に現れると、printf()は特別な意味を表す記号なのか単なる文字なのかの 区別がつかなくなります。 ですから、これらの文字を文字として認識させるために 「\」 を付けて、「\\」、「\"」、「\'」と記述します。
printf("error!!\n\a"); |
変換指定文字列、エスケープシーケンス以外の文字列です。記述された文字列がそのまま出力されます。
printf("Hello!\n"); |
引数については第11章 関数で詳しく説明しますが、関数に渡される値をこう呼びます。 「可変個」というのは、個数が変わるという意味です。通常、引数の個数は関数によって決まっているものですが、printfは少々特殊な関数で、引数の個数が変わります。 ここには、変数や定数、式などを記述します。
"" で囲まれた文字列のみを出力します。可変個引数は不要です。
printf("今日は、いいお天気ですね。\n"); |
出力形式を変換指定文字列で指示します。1つの引数をいろいろな形式で出力したい場合には変換指定文字列の数だけ引数が必要になりますので注意してください。変換指定文字列と引数は左側から順に対応します。
printf関数では表示の見栄えを良くするために%と変換指定子との間に次の指定子を入れることができます。
(例)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を付加 |
数値の出力幅を指定します。
(例)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を詰める |
浮動小数点数の小数点以下の桁数を指定します。
(例)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桁) |
キーボードから書式付きで入力します。
scanf() の f は "format"(書式) の f です。scanf() は printf() と同様に書式指定を行うことにより、「A」のキーを押しても、16進数で入力したり、文字で入力したりというように入力形式を変えることが出来ます。
scanf( 書式指定文字列, 格納可変個引数 );
"" で囲まれた文字列
変換指定文字 | 意味 | 使われるデータ型 |
---|---|---|
%c | 1文字として入力する | 文字型 |
%d | 10進数で入力する | 整数型 |
%x | 16進数で入力する | |
%o | 8進数で入力する | |
%f | 浮動小数点数を入力する | 浮動小数点型 |
%s | 文字列を入力する | 文字型配列 |
※double型の入力は、変換指定子fの前に変換修飾子l(エル)を付加し、"%lf" と表記します。変換修飾子l(エル)を忘れがちですので、注意してください。
※long型の入力は、変換指定子の前に変換修飾子l(エル)を付加し、"%ld" のように表記します。
入力データを格納する領域のアドレス(アドレスについてはポインタの章で詳しく説明します。)を指定します。
変数のアドレスを「&変数名」で記述します。
配列の先頭要素のアドレスを「配列名」で記述します。「&」は不要です。
scanf() の "%s" 変換では空白類がくると読み込みを終了します。そのため、
This is a pen.
といった文字列を読み込むことはできません。
この例では「This」だけが読み込まれます。 (空白類を含む文字列を読み込むときには gets() を用います。 gets() については「標準入出力関数(2)」の章で説明します。)
キーボードから入力された文字はバッファと呼ばれる作業領域にいったん読み込まれ、エンターキーが入力されるとフラッシュ(バッファをクリアし、再びバッファリングが行える状態にすること)されます。
scanf() では、正しく入力しても最後の改行文字はバッファの中に残るため、おかしな動作になるときがあります。(scanf() 実行後に、scanf() の "%c" 変換を行ったとき)
いくつか方法はありますが、
scanf("%*c%c", &c); ↑ 改行の読み捨て
scanf(" %c", &c); ↑ 空白(改行含む)を読み飛ばす。 ただし、空白類文字を入力したいときにはこの方法は使えません。
と記述し、改行を読み捨ててしまいましょう。
変換指定文字列で、期待していなかったデータを入力すると、 バッファのデータをそのまま残し、動作を終了してしまいます。
※ 正しく入力できるように、printf() で入力ガイダンスを表示しましょう。 また、回避方法は「標準ライブラリ関数」の章で説明します。
「初心者のためのポイント学習C言語」 Copyright(c) 2000-2004 TOMOJI All Rights Reserved