2. 出力と入力(pirntf, scanf 関数)

2.1 printf 関数

もう一度例1.1のプログラムを見てみます.

例1.1

ここでは,

printf("a = %d b = %d\n", a, b);
printf("a +b = %d\n", c);

となっており. これらのprintfにより,以下のような結果が出力されます.

このように,データの出力は,printf関数によって行います.printf関数は,前回説明したように,自分の好きな文字(メッセージ)を出力することができます.この他に,例1.1のように変数に設定されたデータを出力することもできます.

printf("a = %d b = %d\n", a, b);

では,値を表示する変数をダブルクォーテーション " ではさまれたものの後ろに並べています.表示される順は,変数のならびの順である.変数の表示はダブルクォーテーションではさまれた文字列で指定します.文字列中に文字 % が現れた場合,ダブルクォーテーションの後に並んでいる変数の値が順に % の直後の文字で指定される書式に従って表示されます.この例では %d で整数を出力します.

%d → 整数(int型)
%f → 浮動小数点(float型,double型)
%c → 文字(char型)

この他にも%s で文字列 %o, %x で8進数,16進数などがあります.


図2.1 書式と変数名の対応

また,文字列を表示するダブルクォーテーション " ではさまれた部分では,例にある \n(改行)のようにエスケープシーケンスを使うことができます.

出力書式の指定

例2.1のように,% の後に桁数等を指定することにより,様々な形で変数を出力することができます.

例2.1

まとめると,printf による出力書式は,以下のように書くことができます.

% [符号] [0] [桁数] [. 小数部] [l] 変換文字   ([ ]は省略可能)

符号 + … データを右詰で出力
- … データを左詰で出力
0 出力する数値や文字列が出力幅より小さい場合には,
空きの桁をゼロで出力する.
省略するとスペースで出力される.
桁数 データを表示する幅(桁数,符号桁,小数点を含む)
l long型を指定

変換文字には以下のようなものがあります.

d 符号付き10進数
o 符号付き8進数
x 16進数
u 符号なしの10進数
c 1文字
s 文字列,ヌルコード(\0)が現れるまで出力
f 浮動小数点数
e 浮動小数点数(指数型式)

[補足] puts 関数

文字列を出力する関数として,puts 関数があります.これは文字列をそのまま1行出力するための関数です.printf 関数のように書式をつけることはできません("%d"とするとそのまま %d と出力されます).また \n 記号がなくても最後に改行されます.

練習問題2.1

例2.1のプログラムを参考に,様々な書式で値を出力し,出力結果を確認せよ.また、puts関数を用いて文字列を出力せよ.

練習問題2.2

例2.1のプログラムを参考に,下図のような出力結果を出すプログラムを作成せよ.(例2.1のi_x, d_x, d_yの値は変更しないこと)

2.2 scanf 関数

例2.2 のプログラムを見てみる

例2.2

#include <stdio.h>

printf("Enter a, x, y -> ");

scanf("%d %f %lf", &a, &x, &y);

scanf 関数は,標準入力装置(キーボード)からデータを入力するためのものです. scanf関数は,次のように書きます.

scanf(書式文字列,入力並び);

例2.2のように書式文字列は,入力したデータの加工方法を記述したもので,printf 関数でも用いた %d のような記述をします.ここでの %d は,入力した文字列を整数として変数に代入するという意味になります.
例では "%d %f %lf" が書式文字列であり文字列で指定するのでダブルクォーテーション " で囲まれています.ここで %lf は double型への変換を表しています.&a, &x, &y が入力並びとなっています.%d&a%f&x%lf &y に対応しています.ここで入力する変数には,変数の前に & を付けます.この & の意味は,後のポインタの所で説明します.ここでは,おまじないのような程度で考えておいて下さい.少しだけ説明すると,変数の前に & を付けるとその変数のアドレスを表します.scanf では,変数のアドレスを渡すことによって変数の箱に値を入れることができます.

値を入力する際は

25 2.35 12.598

のように変数の間をスペースで区切って入力します.これは"%d %f %lf" のように,変数間をスペースで区切るように指定しているためです.

まとめると,scanf による入力書式は,以下のように書くことができます.

% [*] [桁数] [l] 変換文字   ([ ]は省略可能)

* 代入禁止,* がある書式文字列に対応する入力フィールドはスキップされ
データは代入されない
桁数 桁数で示される幅で区切って入力する
l long型を指定

変換文字には以下のようなものがあります

d 符号付き10進数
o 符号付き8進数
x 16進数
u 符号なしの10進数
c 1文字
s 文字列,ヌルコード(\0)が現れるまで出力
f 浮動小数点数
e 浮動小数点数(指数型式)

【注意】 scanf は printf と書式が似ていることから使いやすい関数ですが,非常に長い文字列が入力されたときなど,フォーマットの形に合わない入力が来た場合には,どのような動作が起こるか分からなくなってしまうので,他人に使わせるソフトでは使用しないこと.

練習問題2.3

16進と8進で入力した2つの整数の和を10進で表示するプログラムを作成せよ.