コンソール画面への出力方法

C言語における標準出力(Windowsではコマンドプロンプト,UNIX系ではターミナル)への,文字・数値などの出力方法を解説する.
(なお,C++ではストリームという出力方法が,新たに追加されている.)

注意:下記の標準出力関数を使用するためには, #include <stdio.h> が必要です.

1文字出力

C言語ソースファイルにおいて,シングルクオーテーションで括られた区間(例えば 'A' )は,「文字」と呼ばれる.
コンソール画面に1文字出力するには,putchar関数を用いる.
putchar = put character の意.

関数のプロトタイプ

int putchar(int c);

引数はint型なので,もちろんchar型を渡すことができる.

戻り値は,書き込まれた文字(の文字コード)である.

文字列出力

C言語ソースファイルにおいて,ダブルクオーテーションで括られた区間(例えば "ABC")は,「文字列」と呼ばれる.
文字列は文字(char)型の配列として扱われる.
コンソール画面に文字列出力するには,puts関数を用いる.
puts = put string の意.

関数のプロトタイプ
int puts(const char* str);

具体例としては

puts("Hello World");

と書く.

引数は,文字列のどこかを指すポインタであり,引数から順にヌル文字まで画面に表示する.
(この関数は,引数のポインタを開始点としてヌル文字が必ずあることを前提としている.
従って,故意にヌル文字のない配列を渡すと,どこまでも出力しようとしてメモリーの不正アクセスが起こる.)

戻り値は,関数が正常に終了した場合は「0以上の値」,失敗した場合は「0」を返す.
(普通にPCで実行する場合にはputsが失敗することはまず無いので,戻り値を確かめる必要性は低い.)

この関数は,単純に文字列を出力するのみであり,整数や実数変数の値を表示することはできない.

書式指定出力(printf関数)の使い方

変数に格納されている値や,数値の桁数,16進表示などの,より高度な書式指定出力には,printf関数が用いられる.

関数のプロトタイプ

int printf(const char* str, ...);

文字で書くと

int printf(書式指定文字列, 変数など(省略可)... )

である.
(参考までに,...は,C言語の「可変長引数」という機能で,引数が何個あっても,または無くても良いという,比較的高度な機能を使用している.)

「書式指定文字列」には,表示したい文字そのものと,後述する特別な記号(型フィールド文字)を組み合わせて使う.
printf()関数の重要な機能は,puts()関数のように単に文字を画面に出力するだけでなく,変数や配列に格納された値を表示することができる点にある.

では,何でもかんでもprintfにすれば良いかというと,さにあらず. メモリ容量の厳しい組込みマイコンなどで,ちょっと液晶に文字を表示したいだけの場合などではprintfは大げさ(=メモリーを食い)で,上手に使い分ける.

#include <stdio.h>

int main(void)
{
    int a = 10;

    printf("a = %d \n", a);   /* 変数 a の値を表示.%d の部分が数値に置き換わる. */

    return 0;
}

実行結果

a = 10

書式指定文字列の部分は,別途,変数としても良い.このほうが使い回しがきく.

#include <stdio.h>

int main(void)
{
    int a = 10;

    char fmt[] = "a = %d \n";    /* 書式指定文字列を変数として定義 */

    printf(fmt, a);   /* 変数 a の値を表示. */

    return 0;
}

書式指定文字列中に複数の % 記号を並べれば,複数の変数を順次表示できる.
書式指定文字列中の「 % 記号の数」と「変数の数」は,同じでなければならない.

#include <stdio.h>

int main(void)
{
    int a = 50;
    int b = 3;

    printf("a=%d, b=%d\n" , a, b);  /* カンマ区切りで変数を並べる */

    return 0;
}

やや高度であるが,書式指定文字列中の記号の順序と,そのあとに続く変数の順序を自由に組み合わせることもできる.
具体的には,以下のように% + 順序+$ + 記号 として,入れ替えることもできる.

#include <stdio.h>
	
int main(void)
{
    int a = 50;
    int b = 3;

    printf("%2$d, %1$d\n" , a, b);  /* 2$が二番目の変数b, 1$が一番目の変数a */
	
    return 0;
}

書式指定文字列を複数用意しておき,実行中に変更することで柔軟な出力ができる.

#include <stdio.h>
	
int main(void)
{
    int a = 50;
    int b = 3;

    char fmt1[] = "%1$d, %2$d\n";
    char fmt2[] = "%2$d, %1$d\n";

    char* p = fmt2;    /* ここを変えるだけで表示順序を変更できる */
    printf(p, a, b);  /* 2$が二番目の変数b, 1$が一番目の変数a */
    
    return 0;
}

型フィールド文字の種類

書式指定文字列中の%から始まる型フィールド文字をいろいろ工夫することによって,表示スタイルをいろいろと変化させることが出来る.
処理系によっていろいろ差異や方言があるので,必ずリファレンスマニュアルを参照するべし.

型フィールド文字
m,nには整数値が入る)
意味
整数
%d
整数を 10 進数で表示.
unsigned int型の場合は %u
long int型の場合は %ldunsigned long int型の場合は %lu
long long int型の場合は %lldunsigned long long int型の場合は %llu
1, 2, -35
%nd
整数をn桁の 10 進数で表示,空白はスペースを表示.例:%5dなど.   1
%0nd
整数をn桁の 10 進数で表示,空白は0を表示.例:%05dなど. 0001
%x
整数を16進数で表示.%d同様,%nx や %0nx とすれば桁数指定可.
%Xとすると,A-Fが大文字になる.
1ab, 01ab, 01AB
実数
%f
実数を小数で表示.倍精度実数(double型の場合は%lf,以下同様) 0.100000
%nf
実数をn桁で表示,空白はスペースを表示.例:%8fなど.  0.1000
%.mf
小数点以下 m 桁で表示.例:%.3fなど. 0.100
%n.mf
実数を n 桁で表示,小数部を m 桁で表示.空白はスペースを表示表示.例:%5.3fなど.  0.10
実数(指数形式)
%e
実数を指数形式で表示.
%Eとすると,eを大文字で表示.
0.100000e+01
%ne
実数をn桁の指数形式で表示,空白はスペースを表示   0.1000e+01
%.me
小数点以下をm桁で表示.空白はスペースを表示 0.10e+01
%n.me
実数をn桁の指数形式で表示,小数部をm桁で表示.空白はスペースを表示   0.10e+01
文字
%c
1文字表示 a, C
文字列
%s
文字列を表示 Hello, World!
アドレス値
%p
ポインタ変数の値や,アドレス値 0x7ffeedd438a8

// プログラム例1:
#include <stdio.h>

int main(void)
{
    int a = 30;
    float r = 3.14;
    double s = 6.28;

    printf("int型 変数 a の値\n");
    printf("a = %d \n", a);
    printf("a = %4d \n", a);
    printf("a = %04d \n", a);

    printf("\n");
	
    printf("a = %x \n", a);
    printf("a = %4x \n", a);
    printf("a = %04x \n", a);

    printf("\n");

    printf("a = %X \n", a);
    printf("a = %4X \n", a);
    printf("a = %04X \n", a);

    printf("\n");

    printf("float型 変数 r の値\n");
    printf("r = %f \n", r);
    printf("r = %12f \n", r);
    printf("r = %12.3f \n", r);

    printf("\n");

    printf("r = %e \n", r);
    printf("r = %12.3e \n", r);

    printf("\n");

    printf("double型 変数 s の値\n");
    printf("s = %lf \n", s);
    printf("s = %12lf \n", s);
    printf("s = %12.3lf \n", s);

    printf("\n");

    printf("s = %le \n", s);
    printf("s = %12.3le \n", s);

    return 0;
}

実行結果

int型 変数 a の値
a = 30
a =   30
a = 0030
	
a = 1e
a =   1e
a = 001e
	
a = 1E
a =   1E
a = 001E
	
float型 変数 r の値
r = 3.140000
r =     3.140000
r =        3.140
	
r = 3.140000e+00
r =    3.140e+00
	
double型 変数 s の値
s = 6.280000
s =     6.280000
s =        6.280
	
s = 6.280000e+00
s =    6.280e+00



エスケープシーケンス

文の途中や最後に「改行」など,特殊な文字を出力するためのソースコード中の表記法を「エスケープシーケンス」という.
たとえば,改行を画面に出力したい場合,ソースコード中には¥n または \n と書く.(どちらも同じ意味である.)

#include <stdio.h>

int main()
{
    printf("Hello! \n World \n ");
    return 0;
}

よく使うエスケープシーケンスを以下に示す.

画面に表示したい文字 エスケープシーケンス
¥
¥¥
%
%%
¥’
¥”
タブ
¥t
バックスペース
¥b
ベル(音が鳴る)
¥a
改行
¥n