vsnprintf 【V1.07以降】


フォーマット指定したテキストを配列へ書き込みます。

[所属]

標準ライブラリ

[指定形式]

#include <stdio.h>

int __far vsnprintf(char __far * restrict s, size_t n, const char __far * restrict format, va_list arg);(C99)

[戻り値]

出力された文字(null文字(\0)は除きます)の数を返します。

書き込みエラーが発生した時はEOF(-1)を返します。

[詳細説明]

引数並びのポインタargが指す引数を,sで示された配列に書き込みます。その際の変換方法は,formatが指す文字列で指定される書式に従います。nが0の場合,何も書き込まず,sはヌル・ポインタでもかまいません。その他の場合,n-1番目より後の出力文字は配列に書き込まずに捨て,配列に実際に書き込んだ文字の列の後にヌル文字を書き込みます。領域の重なり合うオブジェクト間で複写が行われるとき,動作は保証されません。

 

書式に対して実引数が不足しているときの動作は保証されません。実引数が残っているにもかかわらず,書式が尽きてしまう場合,余分な実引数は評価するだけで無視されます。

書式は0個以上の指令からなります。%で始まる変換指定以外は,そのまま出力されます。変換指定は0個以上の後続の引数を取り出し,変換して出力されます。

 

formatは,次に示す2種類のディレクティブにより構成されます。

通常文字

変換されずにそのまま出力にコピーされるものです(“%”以外)。

変換指示

0個以上の引数を取り込み,指示を与えるものです。

 

各変換指示は,文字“%”で始まります(出力中に“%”を入れたい場合は,書式文字列の中では“%%”とします)。“%”の後ろは,次のようになります。

 

%[フラグ][フィールド長][精度][サイズ][型指定文字]

 

それぞれの変換指示について,次に説明します。

(1)

フラグ

任意の順に置かれた,変換指示の意味を修飾する0個以上のフラグです。フラグ文字とその意味を次に示します。

-

変換された結果をフィールド中に左詰めにし,右側は空白で満たされます(このフラグが指定されない場合,変換された結果は右詰めにされます)。

+

符号付きの変換の結果を常に+符号,または-符号で始めます(このフラグが指定されない場合,変換された結果は,負の値が変換された場合にのみ符号で始められます)。

スペース

符号付きの変換の最初の文字が符号でない場合,または符号付きの変換が文字を生じない場合,その結果の前にスペース(“ ”)を付けます。スペース・フラグと+フラグとが両方現れる場合,スペース・フラグは無視されます。

#

結果を“代替形式”に変換します。o変換に対しては,その変換結果の最初の数字が0になるようにその精度を増やします。x,またはX変換に対しては,0以外の変換結果の先頭に0x,または0Xを付加します。e,f,g,E,F,G変換に対しては,その変換結果に小数点以下の数字が存在しない場合であっても,小数点“.”を付加します。g,G変換に対しては,変換結果から後ろに続く0が削除されないようにします。これら以外の変換に対しては,その動作は不定となります。

0

d,e,f,g,i,o,u,x,E,F,G,X変換に対し,フィールド長を埋めるために,符号,または基底の指示に続いて0を付加します。

0フラグと-フラグの両方が指定された場合,0フラグは無視されます。

d,i,o,u,x,X変換については,精度を指定している場合,ゼロ(0)フラグを無視します。

0はフラグとして解釈され,フィールド幅の始まりとは解釈されないことに注意してください。

これら以外の変換に対してはその動作は不定となります。

通常,小数点は,その後ろに数字が続く場合にのみ現れます。

(2)

フィールド長

オプショナルな最小フィールド長です。

変換された値がこのフィールド長より小さい場合,左側にスペースが詰められます(前述の左詰めフラグが与えられた場合は右側にスペースが詰められます)。このフィールド長は“*”,または10進整数の形を取ります。“*”で指定した場合,int型の引数をフィールド長として使用します。負のフィールド長は,サポートしていません。負のフィールド長を指定しようとすると,正のフィールド長の前にマイナス(-)フラグが付いたものと解釈されます。

(3)

精度

これに与えられる値は,d,i,o,u,x,X変換に対しては現れる数字の個数の最小値であり,e, f, E,F変換に対しては“.”の後ろに現れる数字の個数であり,g,G変換に対しては最大有効桁数,s変換に対しては最大バイト数です。精度は,“*”,または10進整数が後ろに続く“.”の形式を取ります。“*”を指定した場合,int型の引数を精度として使用します。負の精度を指定した場合,精度を省略したものとみなされます。“.”のみが指定された場合,精度は0とされます。精度がこれら以外の変換指示とともに現れた場合,動作は不定となります。

precisionのことです。

(4)

サイズ

対応する引数のデータ型を解釈するためのデフォルトの方法を変更する,任意選択のサイズ文字hh,h,l,ll,j,z,t,およびLです。

hhを指定した場合,後ろに続くd,i,o,u,x,Xの型指定を強制的にsigned char,またはunsigned charに適用します。hhはさらに,後ろに続くnの型指定を強制的にsigned charへのポインタに適用します。(C99)

hを指定した場合,後ろに続くd,i,o,u,x,Xの型指定を強制的にshort int,またはunsigned short intに適用します。hはさらに,後ろに続くnの型指定を強制的にshortへのポインタに適用します。

lを指定した場合,後ろに続くd,i,o,u,x,Xの型指定を強制的にlong,またはunsigned longに適用します。lはさらに,後ろに続くnの型指定を強制的にlongへのポインタに適用します。

llを指定した場合,後ろに続くd,i,o,u,x,Xの型指定を強制的にlong long,またはunsigned long longに適用します。llはさらに,後ろに続くnの型指定を強制的にlong longへのポインタに適用します。

jを指定した場合,後ろに続くd,i,o,u,x,Xの型指定を強制的にintmax_t,またはuintmax_tに適用します。jはさらに,後ろに続くnの型指定を強制的にintmax_tへのポインタに適用します。(C99)

zを指定した場合,後ろに続くd,i,o,u,x,Xの型指定を強制的にsize_t,またはsigned intに適用します。zはさらに,後ろに続くnの型指定を強制的にsigned intへのポインタに適用します。(C99)

tを指定した場合,後ろに続くd,i,o,u,x,Xの型指定を強制的にptrdiff_t,またはunsigned intに適用します。tはさらに,後ろに続くnの型指定を強制的にptrdiff_tへのポインタに適用します。(C99)

Lを指定した場合,後ろに続くe,E,f,F,g,Gの型指定を強制的にlong doubleに適用します。ただし,本コンパイラではdouble型とlong double型は同じフォーマットであるため,指定による影響はありません。

(5)

型指定文字

適用される変換の型を指定する文字です。

変換の型を指定する文字とその意味を次に示します。

F変換はC99用ライブラリのみ指定可能です。

d,i

int型の引数を符号付きの10進数に変換します。

o,u,x,X

unsigned int型の引数をddddの形式の8進表記(o),符号なしの10進表記(u),符号なしの16進表記(x,またはX)に変換します。x変換に対しては文字abcdefが用いられX変換に対しては文字ABCDEFが用いられます。

f,F

double型(単精度用の関数ではfloat型)の引数を[-]dddd.ddddの形式の10進表記に変換します。

無限大を表すdouble型の引数を変換したときの形式は,f変換に対しては[-]inf,F変換に対しては[-]INFを用います。NaNを表すdouble型の引数を変換したときの形式は,f変換に対しては[-]nan,F変換に対しては[-]NANを用います。(C99)

e,E

double型(単精度用の関数ではfloat型)の引数を,小数点の前に(引数が0でない場合0でない)1つの文字を持ち,小数点以下の数字の個数は精度に等しい[-]d.dddde±ddの形式に変換します。E変換指示は,指数部が“e”ではなく“E”で始まる数字を生成します。

無限大またはNaNを表すdouble型の引数を変換したときの形式は,fまたはF変換指定子と同じです。(C99)

g,G

精度には仮数部の数字の個数を指定するものとし,double型(単精度用の関数ではfloat型)の引数をe(G変換指示の場合E),またはfの形式に変換します。変換結果の末尾の0は結果の小数点部から除かれます。小数点は,後ろに数字が続く場合にのみ現れます。

無限大またはNaNを表すdouble型の引数を変換したときの形式は,fまたはF変換指定子と同じです。(C99)

c

int型の引数をunsigned char型に変換し,変換結果の文字を出力します。

s

引数は文字型の配列を指すポインタでなければなりません。この配列からの文字を,終端を示すnull文字(\0)の前まで(null文字(\0)自身は含まずに)出力します。

精度が指定された場合,それ以上の個数の文字は出力されません。精度が指定されなかった,または精度がこの配列の大きさ以上の値であった場合,この配列はnull文字(\0)を含むようにしてください。

ポインタは常にfarポインタとしてください。定数を渡す場合は,実引数にキャストをつけてポインタであることを明示してください。nullポインタを渡した場合の動作は保証されません。

p

ポインタの値を出力します。ポインタは常にfar ポインタとしてください。定数を渡す場合は,実引数にキャストをつけてポインタであることを明示してください。

n

同じオブジェクト内で出力された文字の個数を格納します。int型へのポインタを引数とします。

%

文字“%”を出力します。引数は変換されません。変換指示は“%%”となります。

[制限]

C99規格のa,A変換はサポートしません。