法大奥山研究室

 previous  contents

13.1. 標準出力と標準エラー出力:put系関数,printf系関数


 ライブラリ stdio.h で出力用に用意された関数は数多くあります。次はその一部です。

関数(プロトタイプ:2段目)出力されるもの出力先
fputc(文字定数, ストリーム)
int fputc(int c, FILE *stream);
文字定数
c はASCIIコード)
ストリーム
putc(文字定数, ストリーム)
int putc(int c, FILE *stream);
文字定数ストリーム
putchar(文字定数)
int putchar(int c);
文字定数標準出力
fputs(文字列リテラル, ストリーム)
int fputs(const char * restrict s, FILE * restrict stream);
文字列リテラルストリーム
puts(文字列リテラル)
int puts(const char *s);
文字列リテラル標準出力
fprintf(ストリーム, フォーマット, 出力元)
int fprintf(FILE * restrict stream, const char * restrict format,...);
フォーマットストリーム
printf(フォーマット, 出力元)
int printf(const char * restrict format,...);
フォーマット標準出力
snprintf(char型配列, 文字数, フォーマット, 出力元)
int snprintf(char * restrict s, size_t n, const char * restrict format,...);
フォーマット
但し,
 文字数 - 1
文字まで。
char型配列
sprintf(char型配列, フォーマット, 出力元)
int sprintf(char * restrict s, const char * restrict format,...);
フォーマットchar型配列

* プロトタイプ内の constrestrict は後に学びます。また,FILE はライブラリ stdio.htypedef によって型定義された「型」です。

ストリーム とは出力先です。ライブラリ stdio.h には次の三つが用意されています。[C99, 7.19.1, 3]

stdout標準出力
stderr標準エラー出力
stdin標準入力

例えば,printf は,fprintfストリームstdout を指定したのと同じです。同じことは,putcputchar についても言えます。[C99, 7.19.6.3, 7.19.7.9]

put出力先
ストリーム標準出力
出力文字fputcputcputchar
文字列fputsputs
printf出力先
ストリーム標準出力文字列
出力フォーマットfprintfprintfsnprintf
sprintf

大きくは put系と printf系に分けられ,前者は指定された文字,あるいは文字列を出力しますが,後者はフォーマットを出力します。「フォーマット」とは,変換指定子を含む文字列のことです。変換指定子は出力元の変数の出力スタイルを指定します。

■変換指定子(conversion specifier)[C99, 7.19.6.1]

/* Example 13.1 */

#include <stdio.h>

int main(void)
{
       char str[] = "ABCDEF";
       char *p;

       for(p = str; *p; p++)
              printf("%td\t%s\t%c\t(%u, %o, %x)\t[%p]\n",
                     p - str, p, *p, *p, *p, *p, p);

       return 0;
}

実行結果です。(丸括弧内は ASCIIコード番号,角括弧内はアドレスです。)

0       ABCDEF  A       (65, 101, 41)   [0xbffffa98]
1       BCDEF   B       (66, 102, 42)   [0xbffffa99]
2       CDEF    C       (67, 103, 43)   [0xbffffa9a]
3       DEF     D       (68, 104, 44)   [0xbffffa9b]
4       EF      E       (69, 105, 45)   [0xbffffa9c]
5       F       F       (70, 106, 46)   [0xbffffa9d]
/* Example 13.2 */

#include <stdio.h>

int main(void)
{
       fprintf(stdout, "This is a test.\n");
       fprintf(stderr, "Error!\n");
       return 0;
}

標準エラー出力されているか否かを実験してみます。(太字部分が入力した箇所です。)

% ./a.out
This is a test.
Error!
% ./a.out > tmp.txt
Error!
% cat tmp.txt
This is a test.
%

2回目の実行でファイル tmp.txt へ出力をリダイレクトすると,エラーメッセージのみが出力されています。そして,tmp.txt には標準出力部分のみが書き込まれています。


 previous  contents