printf
変換仕様の%
後には、フラグ、幅、精度、長さ修飾子、および変換指定子が続きます。変換仕様のサイズに実際的な制限はありますか?
つまり%s
、長さは2文字ですが、長さ%08.2f
は6文字です。私の質問は、C99標準に従って、作成できるフォーマット文字列の最大単一仕様の長さはどれくらいかということです。
printf
変換仕様の%
後には、フラグ、幅、精度、長さ修飾子、および変換指定子が続きます。変換仕様のサイズに実際的な制限はありますか?
つまり%s
、長さは2文字ですが、長さ%08.2f
は6文字です。私の質問は、C99標準に従って、作成できるフォーマット文字列の最大単一仕様の長さはどれくらいかということです。
最大長のそのような変換仕様はありません。あなたがそのようなスペックを見つけたと思うなら、私は1文字長いものを思いつくことができます。
たとえば、フィールドの幅と精度について考えてみます。標準では、それらは10進整数であるとされていますが、範囲は指定されていません。したがって、フィールド幅または精度として任意の大きさの整数を使用して変換指定子を記述できます。
リテラル文字列を意味する場合、それは4095文字です
5.2.4.1変換制限...-
文字
列リテラルまたはワイド文字列リテラル(連結後)の4095文字
..。
私は509文字のC89制限(printf / scanf形式の文字列ではない)に噛まれてきたので、これはC99によってもたらされた良い変更の1つです:-)
編集:glibcの実装(標準定義ではありません)
glibcの実装は、read_int
関数から幅を取得します。
したがって、この実装では、明らかに、制限はINT_MAXです(関数は検索していませんread_int
)。
printf変換仕様の後には、フラグ、幅、精度、長さ修飾子、および変換指定子が続きます。変換仕様のサイズに実際的な制限はありますか?
私は過去にいくつかの標準的なprintf
実装に対処しなければならなかったし、特別な制限は課されていないという私の一般的な印象。
フォーマット文字列は通常、文字ごとに解析されます。(単純なFSMを考えてみてください。)ほとんどのprintf
実装では、内部で何かをバッファリングすることを避けており、数値の場合でも、char by charを10進数に変換して使用します(偶数ではありませんatoi
)。
たとえば、 FreeBSDカーネルprintf
内でがどのように実装されているかを確認できます(他の多くの実装からコードが削除されることがよくあります)。これは確かに単純化された実装です(カーネル固有の微調整がいくつかあります)が、フォーマット文字列が頻繁に処理される方法を反映しています。
注意:glibcのvfprintf()
実装を確認したところ、内部でバッファ(必要な場合)が。で割り当てられていmalloc()
ます。したがって、どちらも特定の制限はありません。
私の質問は、C99標準に従って、作成できるフォーマット文字列の最大単一仕様の長さはどれくらいかということです。
フォーマット指定子は文字列の一部であり、私の知る限り、文字列の長さは標準によって制限されていません。そして、私が上で述べたように、私はそのような制限のある実装を見たことがありません。