printf変換仕様のサイズ制限
-
09-10-2019 - |
質問
printf
変換仕様は次のとおりです %
その後、フラグ、幅、精度、長さの修飾子、変換仕様が続きます。変換仕様のサイズには実用的な制限はありますか?
すなわち %s
長さは2文字です %08.2f
長さ6枚です。私の質問は、C99 Standardによると、作成できる形式の文字列の最大単一仕様の長さはいくらですか?
解決
最大長のそのような変換仕様はありません。あなたがそのような仕様を見つけたと思うなら、私は1つのcharであるものをより長く思いつくことができます。
たとえば、フィールドの幅と精度を考慮してください。この標準では、それらは小桁整数であるが、その範囲を指定していないと述べています。したがって、フィールド幅または精度として任意に大きな整数を使用して、変換仕様を記述できます。
他のヒント
文字通りの文字列を意味する場合、それは4095文字です
5.2.4.1翻訳制限
...
-4095文字列の文字通りまたは広い文字列リテラルの4095文字(連結後)
...
私は509文字のC89制限(printf/scanf形式の文字列ではない)に噛まれたので、これはC99 :-)によってもたらされる良い変更の1つです。
編集:GLIBC実装(標準的な定義ではありません)
GLIBC実装は、aから幅を取得します read_int
働き。
それで、 この実装のために、どうやら、多分, 、制限はint_maxです(私は検索していません read_int
働き).
printf変換仕様の後には、フラグ、幅、精度、長さの修飾子、変換仕様が続きます。変換仕様のサイズには実用的な制限はありますか?
私は過去にいくつかの基準に対処しなければなりませんでした printf
実装と私の一般的な印象は、特定の制限が課されていないという。
通常、フォーマット文字列は文字によって解析された文字です。 (シンプルだと考えてください FSM。) 多くの printf
実装は内部的に何かをバッファリングしないようにし、数字でさえcharを小数点に変換することでCharを使用しないでください(偶数ではありません atoi
).
たとえば方法を確認できます printf
内部に実装されています FreeBSDカーネル (他の多くの実装からは、多くの場合コードを持ち上げます)。これは確かに単純化された実装(カップルカーネル固有の微調整を含む)ですが、フォーマット文字列が頻繁に処理される方法を反映しています。
NBはGlibcをチェックしました vfprintf()
実装と彼らはバッファー(必要に応じて)を内部的に割り当てます malloc()
. 。そのため、特定の制限はありません。
私の質問は、C99 Standardによると、作成できる形式の文字列の最大単一仕様の長さはいくらですか?
フォーマット仕様は文字列の一部であり、私の知る限りの文字列の長さは標準に限定されません。そして、上で述べたように、どちらもそのような制限のある実装を見たことはありません。