質問

フォーマットされた文字列の最終長さを返すC関数が必要であるため、長さを計算するのではなく、ターゲット文字列を適切に割り当てることができます。がある snprintf これは、文字列全体を書くことができない場合にこれを行いますが、残念ながら、それのための幅広いcharの選択肢はありません。

swprintf 必要な長さではなく、エラーの場合は-1を返します(なぜ同じ動作ではないのですか?!?)

言及されたタイトル asprintf また、非幅のバージョンのみを提供するため、役に立たないようです。

_vscwprintf Windowsで使用できますが、CrossPlatform、標準バージョン、または少なくともLinuxバージョンが必要です。

何か案は?ありがとう!

役に立ちましたか?

解決

Posix 2008が追加されました open_wmemstream 伴う関数 vfwprintf, 、必要なことを正確に行います。以前はGNU拡張機能であったため、GNU Systemsで長い間利用できました。

これは、aを構築するために簡単に使用できます awprintf ラッパー。

他のヒント

はい、 swprintf. 。その名前にもかかわらず、 swprintf 広い特徴です snprintf, いいえ sprintf, 、2番目のパラメーターとしてバッファサイズを取るという点です。バッファサイズを取得しないワイドキャラクターバージョンはありません。

また、オーバーフローで-1を返すため、ストリングの合計長さを他の方法で取得する必要があります。これを行う唯一の本当にポータブルな方法は、あるサイズのバッファーから始めて、フォーマットを試みて、それが十分に大きいかどうかを確認し、そうでない場合は、それが十分に大きくなるまで再フォーマットを増やすことです。想像できるように、これはあまり効率的ではありません。

まあ、あなたの期待に基本的な欠陥があるようです。これらを追加:

  1. Windowsにはあなたが望むものがあります
  2. Linuxには非幅のバリアントがあります(asprintf どんな標準でもありませんが、純粋にLinuxと *BSDのGNU拡張機能です)。
  3. posixは、すべての文字列/ファイルをnull端端に定義します char* Arrayは、ほとんどすべてのPOSIX関数の幅広いバージョンの欠如を説明しています。
  4. 2、3、および4の上に、すべての最新のLinuxディストリビューションはUTF-8ベースです。つまり、非幅のバージョンは「使用することを意図している」ことを意味します。

これらを追加すると、なぜこのようなものが必要なのですか?確かにあなたは使用していません wchar_ts unix on you ;). 。もしそうなら、まだ2つのオプションがあります: tchar- ソリューション(プラットフォーム依存typedef)のように、またはUTF-8に完全に切り替えます。

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