質問

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によると、作成できる形式の文字列の最大単一仕様の長さはいくらですか?

フォーマット仕様は文字列の一部であり、私の知る限りの文字列の長さは標準に限定されません。そして、上で述べたように、どちらもそのような制限のある実装を見たことはありません。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top