printf() — 定様式の文字の出力

フォーマット

#include <stdio.h>
int printf(const char *format-string, argument-list);

言語レベル: ANSI

スレッド・セーフ: はい。

ロケール依存: この関数の振る舞いは、 現行ロケールの LC_CTYPE カテゴリーおよび LC_NUMERIC カテゴリーの影響を 受ける可能性があります。また、この振る舞いは、LOCALETYPE(*LOCALEUCS2) または LOCALETYPE(*LOCALEUTF) がコンパイル・コマンドに対して指定されている場合は、現行ロケールの LC_UNI_CTYPE カテゴリーの影響を受ける可能性もあります。詳細については、CCSID およびロケールの理解を参照してください。

説明

printf() 関数は、一連の文字および値をフォーマット設定し、標準出力ストリーム stdout に出力します。 形式指定とは、パーセント記号 (%) で始まり、format-string に従って、引数リストの出力フォーマットを判別するものです。 format-string はマルチバイト文字ストリングで、初期シフト状態で開始して終了します。

format-string は左から右へ読み取られます。 最初の形式指定が見つかると、format-string 後の最初の引数の値が形式指定に従って、変換され出力されます。2 番目の形式指定は、format-string 後の 2 番目の引数を変換し出力させるというように、format-string の最後まで順に行われます。形式指定にあるよりも多くの引数が存在する場合は、余分の引数は評価され、無視されます。すべての形式指定に対して引数が足りない場合は、予期しない結果が引き起こされることになります。

形式指定の形式は、以下のとおりです。

構文図を読む構文図をスキップする>>-%--+--------+--+----+--+----------+--+----+---------------><
      '-フラグ-'  '--'  '-.-- 精度-'  +-h--+
                                        +-L--+
                                        +-l--+
                                        +-ll-+
                                        +-H--+
                                        +-D--+
                                        '-DD-'
 

変換の対象は、次の未使用の引数ではなく、引数リスト内の format-string の後で、「n 番目」の引数に適用するように指定できます。 この場合、変換文字 % はシーケンス %n$ に置き換えられます。ここで n は範囲 [1,NL_ARGMAX] 内の 10 進の整数で、引数リスト内の引数の位置を与えます。 この機能により、特定言語に適した順序で引数を選択する書式ストリングの定義が得られます。

代替の形式指定の形式は、以下のとおりです。

構文図を読む構文図をスキップする>>-%--arg-number$--+--------+--+----+--+----------+--+----+----->
                   '-フラグ-'  '--'  '-.-- 精度-'  +-h--+
                                                     +-L--+
                                                     +-l--+
                                                     +-ll-+
                                                     +-H--+
                                                     +-D--+
                                                     '-DD-'
 
>------------------------------------------------------------><
 

前のダイアグラムで説明した形式指定を使用して、引数リスト内の特定の項目を代わりに割り当てることができます。 この形式指定と前の形式指定は、printf() への同じ呼び出しで混用できません。 混用した場合は、予測不能な結果が発生します。

arg-number は正整数定数で、この場合、1 は引数リスト内の最初のエントリーを示します。 arg-number は、引数リスト内のエントリー数より多くできません。そうでないと、予期しない結果になります。 arg-number はまた、NL_ARGMAX より多くならないようにします。

%n$ 形式の変換指定を含む書式ストリングでは、引数リスト内の番号を持つ引数は、必要な回数だけ、書式ストリングから 参照することができます。

%n$ 形式の変換指定を含む書式ストリングでは、フィールド幅または精度はシーケンス *m$ によって示される場合がありますが、ここで m は範囲 [1,NL_ARGMAX] 内の 10 進の整数で、以下の例のように、引数リスト内 (書式引数の後) におけるフィールド幅または精度を含む整数引数の位置を与えます。

printf("%1$d:%2$.*3$d:%4$.*3$d\n", hour, min, precision, sec);

format-string には、番号を持つ引数指定 (すなわち、%n$ および *m$)、または番号を持たない引数指定 (すなわち、% および *) を含めることができますが、通常、両方を含めることはできません。 唯一の例外として、%% は %n$ 形成で混用することが可能です。 番号を持つ引数指定と番号を持たない引数指定を format-string ストリングで混用した場合、結果は予期できません。 番号を持つ引数指定が使用されると、「n 番目」の引数を指定するには、最初から (n-1) 番目の引数が書式ストリング内に指定される必要があります。

形式指定の各フィールドは、単一文字、または数字で、特殊な形式オプショ ンを示します。type 文字 (最後のオプションの形式フィールドの後に現れる) は、関連する引数を文字、ストリング、数字、またはポインターとして解釈される かどうかを判別します。最もシンプルな形式指定には、パーセント記号と type 文字のみが含まれます (例えば、%s)。

オプションの以下のフィールドは、フォーマット設定のその他の側面を制御します。

フィールド
説明
フラグ
符号、ブランク、10 進小数点、8 進数および 16 進数の接頭部の出力と出力の位置調整、および wchar_t 精度単位のセマンティクス。
width
出力される最小バイト数
精度
表 4 を参照してください。
h、l、ll、L、H、D、DD
予期される引数のサイズは以下のとおりです。
h
d、i、o、u、x、X、および n 型の接頭部で、引数が short 型整数または符号なし short 型整数であることを指定する。
l
d、i、o、u、x、X、および n 型の接頭部で、引数が long int または unsigned long int であることを指定する。
ll
d、i、o、u、x、X、および n 型の接頭部で、引数が long long 型整数または符号なし long long 型整数であることを指定する。
L
e、E、f、F、g、または G 型の接頭部で、引数が long 型 double であることを示す。
H
e、E、f、F、g、または G 型の接頭部で、引数が _Decimal32 であることを示す。
D
e、E、f、F、g、または G 型の接頭部で、引数が _Decimal64 であることを示す。
DD
e、E、f、F、g、または G 型の接頭部で、引数が _Decimal128 であることを示す。

形式指定の各フィールドについては、以下で詳細に説明します。パーセント記号 (%) の後に、形式フィールドとして意味を持たない文字が続いた場合は、文字は単に stdout にコピーされます。例えば、パーセント記号文字を出力するには、%% を使用します。

type 文字とその意味を、次の表で説明します。

文字 引数 出力フォーマット
d, i 整数 符号付き 10 進整数。
u 整数 符号なし 10 進整数。
o 整数 符号なし 8 進整数。
x 整数 符号なし 16 進整数。(abcdef を使用)
X 整数 符号なし 16 進整数。(ABCDEF を使用)
D(n,p) パック 10 進数 形式は [-] dddd.dddd 。小数点の後の桁数は指定の精度と等しくなります。 精度が欠落している場合のデフォルトは p。精度がゼロで # フラグが指定されていない場合、小数点文字は表示されません。 n および p が * の場合は引数リストの引数が値を提供します。 n および p は、引数リストでフォーマット設定されている値の前になければなりません。 少なくとも 1 文字は小数点の前になければなりません。 値は、適切な桁数に丸められます。
f 浮動小数点 形式 [-]dddd.dddd を持つ符号付き値。dddd は 1 つ以上の 10 進桁。小数点の前の桁数は、数字の大きさによって異なります。小数点の後の桁数は、要求した精度と等しくなります。2
F 浮動小数点 小文字英字の代わりに大文字英字が使用される点を除き、f 形式と同じです。2
e 浮動小数点 [-]d.dddd e[ sign]ddd の形式を持つ、符号のついた値。ここで、d は、単一 10 進数字で、dddd は、1 つ以上の 10 進数字、dddd は 1 つ以上の 10 進数字、ddd は 2 つまたは 4 つの 10 進数字、そして、sign は + または -。2
E 浮動小数点 小文字英字の代わりに大文字英字が使用される点を除き、e 形式と同じです。2
g 浮動小数点 f または e 形式の符号付き値の出力。e 形式は、値の指数が -4 未満または 精度 より大きいときにだけ使用されます。末尾のゼロは切り捨てられ、小数点 1 つ以上の桁が続く場合にのみ、小数点が表れます。2
G 浮動小数点 小文字英字の代わりに大文字英字が使用される点を除き、g 形式と同じです。2
c 文字 (バイト) 単一文字。
s ストリング 文字 (バイト) は、最初のヌル文字 (¥0) まで、または 精度に達するまで出力されます。
n 整数へのポインター 現時点までに、正常に stream またはバッファーへ出力された文字 (バイト) の数。 この値は、アドレスが引数として与えられる整数に保管されます。
p ポインター 出力可能文字のシーケンスに変換されるポインター。 以下のいずれかにすることができます。
  • スペース・ポインター
  • システム・ポインター
  • 呼び出しポインター
  • プロシージャー・ ポインター
  • オープン・ポインター
  • サスペンド・ポインター
  • データ・ポインター
  • ラベル・ポインター
lc または C ワイド文字 (wchar_t) 文字は、wctomb() の呼び出しによって行われた場合と同様に、マルチバイト文字に変換され、この文字が出力されます。1
ls または S ワイド文字 最初の (wchar_t) ヌル文字 (L¥0) まで、または、精度に達するまで、(wchar_t) 文字は、wcstombs() の呼び出しによって行われた場合と同様にマルチバイト文字に変換され、これらの文字は出力されます。 引数がヌル・ストリングの場合は (null) が出力されます。1
注:
  1. 詳細は、wctomb() 関数に関する文書または wcstombs() に関する文書を参照してください。 ワイド文字で追加情報を見つけることもできます。
  2. H、D、または DD 形式サイズ指定子が使用されていない場合、保障される出力は 15 桁の有効数字のみです。

次のリストで、i5/OS® ポインターで出力される値の形式を示し、出力される値のコンポーネントの簡単な説明を提供します。

スペース・ポインター: SPP:Context:Object:Offset:AG

        Context: コンテキストのタイプ、サブタイプ、および名前
        Object:  オブジェクトのタイプ、サブタイプ、および名前
        Offset:  スペース内のオフセット
        AG:     活動化グループ ID

システム・ポインター:  SYP:Context:Object:Auth:Index:AG

        Context: コンテキストのタイプ、サブタイプ、および名前
        Object:  オブジェクトのタイプ、サブタイプ、および名前
        Auth:   権限
        Index:   ポインターに関連付けられたインデックス
        AG:     活動化グループ ID

呼び出しポインター:  IVP:Index:AG

        Index:   ポインターに関連付けられたインデックス
        AG:     活動化グループ ID

プロシージャー・ポインター:  PRP:Index:AG

        Index:   ポインターに関連付けられたインデックス
        AG:     活動化グループ ID

サスペンド・ポインター:  SUP:Index:AG

        Index:   ポインターに関連付けられたインデックス
        AG:     活動化グループ ID

データ・ポインター:  DTP:Index:AG

        Index:   ポインターに関連付けられたインデックス
        AG:     活動化グループ ID

ラベル・ポインター:  LBP:Index:AG

        Index:   ポインターに関連付けられたインデックス
        AG:     活動化グループ ID

NULL ポインター:  NULL

i5/OS オペレーティング・システム上におけるポインターの出力および走査には、次の制約事項が適用されます。

i5/OS ポインターの使用法についての詳細は、「IBM Rational Development Studio for i: ILE C/C++ Programmer's Guide」を参照してください。

INFINITY または非数字 (NaN) の浮動小数点の値が e、f、または g 形式を使用してフォーマットされた場合、出力ストリングは infinity または nan です。INFINITY または非数字 (NaN) の浮動小数点の値が E、F、または G 形式を使用してフォーマットされた場合、出力ストリングは INFINITY または NAN です。

フラグ文字とその意味は以下のとおりです (複数のフラグを形式指定に入れることができます)。

フラグ 意味 デフォルト
- フィールド幅内で結果を左そろえする。 右そろえ。
+ 出力値が符号付き型の場合は、出力値の前に符号 (+ または -) が付けられる。 負の符号付き値にのみ符号が現れる (-)。
ブランク (' ') 出力値が符号付きで正の場合は、出力値の前にブランクが付けられる。+ フラグは ブランク フラグを上書きする (両方のフラグが現れ、正の 符号付き値が符号と一緒に出力される場合)。 ブランクなし。
# o、x、または X 形式で使用される場合、# フラグは、ゼロ以外の出力値の先頭に 0、0x、または 0X をそれぞれ付ける。 接頭部なし。
f、F、D(n,p)、e、または E 形式で使用される場合、# フラグは、常に、出力値に小数点を強制的に含める。 小数点は、数字がそのあとに続いている場合にだけ現れる。
g または G 形式で使用される場合、# フラグは、常に、出力値に小数点を含むことを強制し、後続ゼロの切り捨てが起こらないようにする。 小数点は、数字がそのあとに続いている場合にだけ現れる。後続ゼロは切り捨てられる。
ls または S 形式で使用される場合、# フラグは、文字のサイズに関係なく、精度が文字で測定されるようにする。 例えば、1 バイト文字を出力する場合、精度が 4 だと、結果として 4 バイトで出力されます。 2 バイト文字を出力する場合、精度が 4 だと、結果として 8 バイトで出力されます。 精度は、出力される最大バイト数を示す。
p 形式で使用された場合、# フラグはポインターを 16 進数字に変換します。 テラスペース環境の場合を除き、これらの 16 進数字をポインター変換し直すことはできません。 出力可能文字のシーケンスに変換されるポインター。
0 d、i、D(n,p) o、u、x、X、e、E、f、F、g、または G 形式で使用されると、0 フラグによって、先行 0 で出力をフィールド幅まで埋め込む。 0 フラグは、精度が整数に指定された場合、または - フラグが指定された場合は、無視される。 スペースを埋め込む。D(n,p) に埋め込むスペースはなし。

# フラグは、c、lc、d、i、u、または s 型と一緒に使用してはなりません。

Width は、負以外の 10 進の整数で、出力される最小文字数を制御します。出力値の文字数 (バイト) が指定した width 未満の場合、最小幅になるまで (- フラグを指定したかどうかに応じて)、左側または右側にブランクが追加されます。

width では値の切り捨ては行われません。出力値の文字数 (バイト) が指定された width より大きいか、または width が指定されない場合は、すべての値の文字が (精度 指定に従って) 出力されます。

ls または S 型の場合、width はバイトで指定されます。 出力値のバイト数が指定した幅未満の場合、最小幅になるまで (- フラグを指定したかどうかに応じて)、左側または右側に 1 バイトのブランクが追加されます。

width の指定には、アスタリスク (*) が可能です。その場合は、引数リストの引数が値を提供します。width 引数は、引数リストでフォーマット設定されている値の前になければなりません。

精度 にはピリオドが前にくる、負以外の 10 進の整数で、出力される文字数、または小数点以下の桁数を指定します。 width の指定とは異なり、精度 では出力値の切り捨てや、浮動小数点数値または パック 10 進数 値の丸めが起こり得ます。

精度 の指定には、アスタリスク (*) が可能です。その場合は、引数リストの引数が値を提供します。精度 引数は、引数リストでフォーマット設定されている値の前になければなりません。

精度 値の解釈と 精度 が省略された場合のデフォルトは、次の表に示されるように、type によって異なります。

表 4. 精度の値
タイプ 意味 デフォルト
   i
   d
   u
   o
   x
   X
精度 は出力される数字の最小桁数を指定する。引数内の数字の桁数が 精度 より少ない場合、出力値の左側をゼロ で埋め込む。数字の桁数が 精度 を超えても、値は切り捨てられない。 精度 が 0 であるか、すべて省略された場合、または、ピリオド (.) が後に数字を伴わずに指定された場合、精度 は 1 に設定される。
   f
   F
   D(n,p)
   e
   E
精度 は小数点の後ろに出力される数字の桁数を指定する。最後の出力数字は丸められる。 f、F、e および E のデフォルトの 精度 は 6。 D(n,p) のデフォルトの 精度 は p。精度 が 0 または後ろに数値を伴わずに表示されたピリオドの場合は、小数点は出力されない。
   g
   G
精度 は、有効数字出力の最大桁数を指定する。 すべての有効数字が出力される。デフォルトの 精度 は 6。
   c
影響なし。 文字が出力される。
   lc
影響なし。 wchar_t 文字は変換され、結果であるマルチバイト文字は出力される。
   s
精度 は出力される文字 (バイト) の最大数を指定する。 余分な 精度 での文字 (バイト) は出力されない。 文字はヌル文字が検出されるまで出力される。
   ls
精度 は出力されるバイトの最大数を指定する。 精度 を超過するバイトは出力されない。しかしマルチバイトの整合性は常に維持される。 wchar_t 文字は変換され、結果であるマルチバイト文字は出力される。

戻り値

printf() 出力されるバイト数を戻します。 errno の値は、次のいずれかに設定されます。

意味
EBADMODE
指定されたファイル・モードが無効です。
ECONVERT
変換エラーが発生しました。
EIOERROR
リカバリー不能な入出力エラーが発生しました。
EIORECERR
リカバリー可能な入出力エラーが発生しました。
EILSEQ
無効なマルチバイト文字シーケンスが検出されました。
EPUTANDGET
読み取り操作の後、正しくない書き込み操作が発生しました。
ESTDOUT
stdout をオープンできません。
注:
printf() 関数の基数文字は、ロケールに依存します。 基数文字とは、形式タイプ f、F、D(n,p)、e、E、g、および G のストリング・パラメーターの # フラグで使用される小数点のことです。

printf() の使用例

この例では、様々なフォーマットでデータを出力します。

#include <stdio.h>                                               
#include <stdlib.h>                                              
                                                                 
int main(void)                                                   
{                                                                
    char ch = 'h', *string = "computer";                         
    int count = 234, hex = 0x10, oct = 010, dec = 10;            
    double fp = 251.7366;                                        
    wchar_t wc = (wchar_t)0x0058;                                
    wchar_t ws[4];                                                       
                                                     
    printf("1234567890123%n4567890123456789¥n¥n", &count);
    printf("Value of count should be 13; count = %d¥n¥n", count);
    printf("%10c%5c¥n", ch, ch);
    printf("%25s¥n%25.4s¥n¥n", string, string);
    printf("%f    %.2f    %e    %E¥n¥n", fp, fp, fp, fp);
    printf("%i    %i     %i¥n¥n", hex, oct, dec);
}                                                                   
/*****************  Output should be similar to:  ***************** 
                                                                    
234   +234    000234     EA    ea     352                           
                                                                    
12345678901234567890123456789                                       
                                                                    
Value of count should be 13; count = 13                             
 
                                                                      
  h    h                                                              
          computer                                                    
              comp                                                    
                                                                      
251.736600    251.74    2.517366e+02    2.517366E+02                  
                                                                      
16    8     10                                                        
 
*******************************************************************/  

printf() の使用例

     #include <stdio.h>
     #include <stdlib.h>
     #include <locale.h>
     /* This program is compiled with LOCALETYPE(*LOCALEUCS2) and             */
     /* SYSIFCOPT(*IFSIO)                                               */
     /* We will assume the locale setting is the same as the CCSID of the */
     /* job.  We will also assume any files involved have a CCSID of      */
     /* 65535 (no convert).  This way if printf goes to the screen or     */
     /* a file the output will be the same.                               */
    int main(void)
    {
        wchar_t wc = 0x0058;     /* UNICODE X */
        wchar_t ws[4];
        setlocale(LC_ALL,
         "/QSYS.LIB/EN_US.LOCALE"); /* a CCSID 37 locale */
        ws[0] = 0x0041;        /* UNICODE A   */
        ws[1] = (wchar_t)0x0042;        /* UNICODE B   */
        ws[2] = (wchar_t)0x0043;        /* UNICODE C   */
        ws[3] = (wchar_t)0x0000;
        /* The output displayed is CCSID 37  */
        printf("%lc   %ls\n\n",wc,ws);
        printf("%lc   %.2ls\n\n",wc,ws);

        /* Now let's try a mixed-byte CCSID example  */
        /* You would need a device that can handle mixed bytes to  */
        /* display this correctly.                         */

        setlocale(LC_ALL,
        "/QSYS.LIB/JA_JP.LOCALE");/* a CCSID 5026 locale */

        /* big A means an A that takes up 2 bytes on the screen   */
        /* It will look bigger then single byte A                 */
        ws[0] = (wchar_t)0xFF21;        /* UNICODE big A   */
        ws[1] = (wchar_t)0xFF22;        /* UNICODE big B   */
        ws[2] = (wchar_t)0xFF23;        /* UNICODE big C   */
        ws[3] = (wchar_t)0x0000;
        wc = 0xff11;                    /* UNICODE big 1   */

        printf("%lc   %ls\n\n",wc,ws);

        /* The output of this printf is not shown below and it   */
        /* will differ depending on the device you display it on,*/
        /* but if you looked at the string in hex it would look  */
        /* like this:  0E42F10F404040400E42C142C242C30F          */
        /* 0E is shift out, 0F is shift in, and 42F1 is the      */
        /* big 1 in CCSID   5026  */

        printf("%lc   %.4ls\n\n",wc,ws);

        /* The output of this printf is not shown below either. */
        /* The hex would look like:                             */
        /* 0E42F10F404040400E42C10F                             */
        /* Since the precision is in bytes we only get 4 bytes  */
        /* of the string.         */

        printf("%lc   %#.2ls\n\n",wc,ws);

        /* The output of this printf is not shown below either. */
        /* The hex would look like:                             */
        /* 0E42F10F404040400E42C142C20F                         */
        /* The # means precision is in characters reguardless   */
        /* of size.  So we get 2 characters of the string.      */
    }
 /*****************  Output should be similar to:  *****************


 X     ABC

 X     AB

 *******************************************************************/
 

printf() の使用例

 #include <stdio.h>
 #include <stdlib.h>
 #include <locale.h>
 /* This program is compile LOCALETYPE(*LOCALE)  and               */
 /* SYSIFCOPT(*IFSIO)    */
 int main(void)
 {
     wchar_t wc = (wchar_t)0x00C4;     /*  D */
     wchar_t ws[4];
     ws[0] = (wchar_t)0x00C1;        /* A   */
     ws[1] = (wchar_t)0x00C2;        /* B   */
     ws[2] = (wchar_t)0x00C3;        /* C   */
     ws[3] = (wchar_t)0x0000;
     /* The output displayed is CCSID 37  */
     printf("%lc   %ls\n\n",wc,ws);

     /* Now let's try a mixed-byte CCSID example  */
     /* You would need a device that can handle mixed bytes to  */
     /* display this correctly.                         */

     setlocale(LC_ALL,
     "/QSYS.lib/JA_JP.LOCALE"); /* a CCSID 5026 locale */

     /* big A means an A that takes up 2 bytes on the screen   */
     /* It will look bigger than single byte A                 */

     ws[0] = (wchar_t)0x42C1;        /* big A   */
     ws[1] = (wchar_t)0x42C2;        /* big B   */
     ws[2] = (wchar_t)0x42C3;        /* big C   */
     ws[3] = (wchar_t)0x0000;
     wc = 0x42F1;                    /* big 1   */

     printf("%lc   %ls¥n¥n",wc,ws);

     /* The output of this printf is not shown below and it   */
     /* will differ depending on the device you display it on,*/
     /* but if you looked at the string in hex it would look  */
     /* like this:  0E42F10F404040400E42C142C242C30F          */
     /* 0E is shift out, 0F is shift in, and 42F1 is the      */
     /* big 1 in CCSID   5026  */

     printf("%lc   %.4ls\n\n",wc,ws);

     /* The output of this printf is not shown below either. */
     /* The hex would look like:                             */
     /* 0E42F10F404040400E42C10F                             */
     /* Since the precision is in bytes we only get 4 bytes  */
     /* of the string.         */

     printf("%lc   %#.2ls\n\n",wc,ws);

     /* The output of this printf is not shown below either. */
     /* The hex would look like:                             */
     /* 0E42F10F404040400E42C142C20F                         */
     /* The # means precision is in characters regardless   */
     /* of size.  So we get 2 characters of the string.      */
 }
 /*****************  Output should be similar to:  *****************


 D     ABC


 *******************************************************************/
 

関連情報



[ ページのトップ | 前ページ | 次ページ | 目次 | 索引 ]