asprintfにwchar_tバージョンはありますか?
質問
フォーマットされた文字列の最終長さを返す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を返すため、ストリングの合計長さを他の方法で取得する必要があります。これを行う唯一の本当にポータブルな方法は、あるサイズのバッファーから始めて、フォーマットを試みて、それが十分に大きいかどうかを確認し、そうでない場合は、それが十分に大きくなるまで再フォーマットを増やすことです。想像できるように、これはあまり効率的ではありません。
まあ、あなたの期待に基本的な欠陥があるようです。これらを追加:
- Windowsにはあなたが望むものがあります
- Linuxには非幅のバリアントがあります(
asprintf
どんな標準でもありませんが、純粋にLinuxと *BSDのGNU拡張機能です)。 - posixは、すべての文字列/ファイルをnull端端に定義します
char*
Arrayは、ほとんどすべてのPOSIX関数の幅広いバージョンの欠如を説明しています。 - 2、3、および4の上に、すべての最新のLinuxディストリビューションはUTF-8ベースです。つまり、非幅のバージョンは「使用することを意図している」ことを意味します。
これらを追加すると、なぜこのようなものが必要なのですか?確かにあなたは使用していません wchar_t
s unix on you ;)
. 。もしそうなら、まだ2つのオプションがあります: tchar
- ソリューション(プラットフォーム依存typedef)のように、またはUTF-8に完全に切り替えます。