第5章の1 printf関数

1. この章で扱う関数

標準入力(キーボードからの入力)、標準出力(画面への出力)を行う標準ライブラリ関数のうち、特に使用頻度の高い、printf() と scanf() について説明します。尚、その他の標準入出力関数については 第8章 をご参照下さい。

標準入出力関数を使用するには、#include <stdio.h> が必要です。「#include」については「18-2.#include」を参照してください。

2. printf()

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

【書き方】
printf( 書式文字列, 可変個引数 );

(1) 書式文字列

“”で囲まれた文字列

変換指定文字列

% ではじまり、出力データの変換形式を指定します。
尚、「%」を文字として表現するには「%%」と記述します。

【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

バックスラッシュと円マークは同じものです。環境により、文字コード 0x5C がバックスラッシュ()として表示される場合と円記号()として表示される場合があります。表示の違いに注意しましょう。

\ はエスケープシーケンスの始まりを示し、” は文字列、’ は文字の始まりと終わりを示します。そのため、これらの文字が文字列中に現れると、printf()は特別な意味を表す記号なのか単なる文字なのかの区別がつかなくなります。
ですから、これらの文字を文字として認識させるために 「\」 を付けて、「\」、「\”」、「\’」と記述します。

// 例
printf("error!!\n\a");

一般文字列

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

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

(2) 可変個引数

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

出力データの無い場合

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

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

1個以上の出力データがある場合

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

printf関数の使用例  サンプルプログラム

#include    <stdio.h>

int main(void)
{
    int    a;
    long    l;
    float    b;
    char    st[] = "printf test";

    // 同じ整数を3種類で表示する
    a = 67;
    printf("10  : %d\n",a);        // aを10進数で出力
    printf("16x : %x\n",a);        // aを16進数で出力
    printf("c   : %c\n",a);        // aを文字として出力

    l = 1234567890;
    printf("ld  : %ld\n",l);       // lをlong型10進数で出力

    // 同じ浮動小数点数を2種類で表示する
    b = 1234.56;
    printf("f   : %f\n",b);        // bを小数点で出力
    printf("e   : %e\n",b);        // bを指数形式で出力

    // stを文字列で表示する
    printf("s   : %s\n",st);

    return 0;
}

〇 演習問題

問1

( a + b ) / ( c * b ) を計算するプログラムを作りなさい。
ただし、a = 53.6、b = 84.7、c = 57.89 とする。
また、計算結果は、printf( )関数を用いて小数形式と指数形式の両方で画面出力しなさい。

【実行結果例】
小数形式 = 0.028206
指数形式 = 2.820559e-02

問2

文字型配列 str を文字列 “SKY” で初期設定し、printf()関数を用いて次の各々で内容を画面出力しなさい。

  • 配列要素 str[0]~str[3] を各々、10進数で表示
  • 配列要素 str[0]~str[3] を各々、16進数で表示
  • 配列要素 str[0]~str[3] を各々、文字で表示
  • str の内容を文字列で表示

【実行結果例】
str[0] = 83 53 S
str[1] = 75 4b K
str[2] = 89 59 Y
str[3] = 0 0
文字列 = SKY

解答例

// 問1
#include <stdio.h>

int main(void)
{
    double a = 53.6, b = 84.7, c = 57.89;
    double kekka;

    kekka = (a + b) / (c * b);

    printf("小数形式 = %f\n", kekka);
    printf("指数形式 = %e\n", kekka);

    return 0;
}
// 問2
#include <stdio.h>

int main(void)
{
    char str[] = "SKY";

    printf("str[0] = %d %x %c\n", str[0], str[0], str[0]);
    printf("str[1] = %d %x %c\n", str[1], str[1], str[1]);
    printf("str[2] = %d %x %c\n", str[2], str[2], str[2]);
    printf("str[3] = %d %x %c\n", str[3], str[3], str[3]);
    printf("文字列 = %s\n", str );

    return 0;
}

3. printf()の表示を整える

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

%[フラグ][フィールド幅][.精度][修飾子]変換指定子

(1) フラグ

  • – : 左詰めに表示する(省略時には右詰め)
  • + : 符号を付ける(省略時には “-” 符号のみ)
  • # : 数値の表記形式がわかるように表示する
  • 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);

(2) フィールド幅

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

// 例
int data = 123;

printf("%d\n", data);
printf("%5d\n", data);
printf("%10d\n", data);
printf("%2d\n", data);
printf("%05d\n", data);

(3) 精度

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

// 例
double x = 654.321;

printf("%f\n", x);
printf("%12f\n", x);
printf("%9.2f\n", x);

〇 演習問題

整数型の配列 data1 に図1のようにデータが初期設定されている。 また、浮動小数点型の配列 data2 に図2のようにデータが初期設定されている。
これらの配列の中身を printf()関数を用いて、実行結果のように画面表示せよ。

解答例

#include <stdio.h>

int main(void)
{
    int data1[4] = {1, 22, 333, 4444};
    double data2[4] = {12.34, 0.002, 5678.12, 912.1};

    printf("data1[0] = %4d\n", data1[0]);
    printf("data1[1] = %4d\n", data1[1]);
    printf("data1[2] = %4d\n", data1[2]);
    printf("data1[3] = %4d\n\n", data1[3]);

    printf("data2[0] = %8.3f\n", data2[0]);
    printf("data2[1] = %8.3f\n", data2[1]);
    printf("data2[2] = %8.3f\n", data2[2]);
    printf("data2[3] = %8.3f\n", data2[3]);

    return 0;
}

コメント