符号なしlong longおよびsprintfを備えたVisual C ++ 6.0
質問
Visual C ++ 6.0(プレーンC)で符号なしlong long値をsprintf()したい。
char buf[1000]; //bad coding
unsigned __int64 l = 12345678;
char t1[6] = "test1";
char t2[6] = "test2";
sprintf(buf, "%lli, %s, %s", l, t1, t2);
結果を与える
12345678, (null), test1
(test2
が印刷されないことに注意してください)
and l = 123456789012345
例外ハンドルを提供します
提案はありますか
解決
Visual C ++ 6.0でunsigned __int64
値を印刷するには、%I64u
ではなく%lli
を使用する必要があります( MSDNのこのページ)。 <=>は、Visual Studio 2005以降のバージョンでのみサポートされています。
したがって、コードは次のようになります。
sprintf(buf, "%I64u, %s, %s", l, t1, t2);
他のヒント
printfは、省略記号を使用して変数の引数リストを渡します。表示される(null)はlong longの2番目の部分で、たまたますべて0ビットです。 1 <!> lt; <!> lt; 60 + 1 <!> lt; <!> lt; 30に設定すると、1 <!> lt; <!> lt; 60パーツとしてクラッシュします。 char *として解釈されます。
正しい解決策は、数値を10桁の3つの部分に分割することです。<!> quot; verylongvalue%10000000000 <!> quot; <!> quot;(verylongvalue / 10000000000)%10000000000 <!> quot; <!> quot; verylongvalue / 100000000000000000000 <!> quot;。
どうやら、必要なadditionaltext
(文字列)にchar *
を割り当てなかったようです。 long int
が処理され、コンマがコピーされ、%s
のみが(null)
を生成したことに注意してください。