2016-08-29 4 views
-1

が、私はこのは私がのCString ::フォーマットを使用するか

コード1のような2コード持ってsprintf_sべき:CStringの:: Formatメソッドを

CString cStr; 
char* ToString(CString pszFormat, ...) 
{ 
    va_list argList; 
    va_start(argList, pszFormat); 
    cStr.FormatV(_T(pszFormat), argList); 
    va_end(argList); 
    return (LPTSTR)(LPCTSTR)cStr; 
    //Note that this will return the pointer to the cstring content 
} 

コード2:sprintf_s方法

char strChar[100]; 
char* ToString(char const* const _Format, ...) 
{ 
    va_list argList; 
    va_start(argList, _Format); 
    vsprintf_s(strChar, _Format, argList); 
    va_end(argList); 
    return strChar; 
    //Note that this will return the pointer to the string content 
} 

でコード1、私は完全に安全だと感じています - 私は長さが長すぎるかもしれないことを恐れる必要はありません。しかし、コード1はパフォーマンスを低下させる恐れがあります。私はそれがメモリリークを引き起こすかどうかわからない。そして、Cstringに動的な長さがあると、多分、それは誰のビジネスのようにメモリを割り振り、解放するだろうと思います。

私はコード2を思いついています。しかし、コード2では、_Formatを長すぎるような長さの文字列を1000に渡すと危険に直面します。プログラムが 'バッファーが小さすぎます'というエラーでクラッシュします。

私が優れている1かわからない:CStringの::フォーマットまたはsprintf_s? sprintf_sが実際にパフォーマンスを向上させ、CString :: Formatがパフォーマンスに悪い場合は、sprintf_sで「バッファが小さすぎる」のを防ぐためにさらに努力します。しかし、sprintf_sがそれほど価値がない場合は、CString :: Formatを使用します。

は、読書のためにありがとうございます。あなたはstrCharのバッファがオーバーフローかもしれないと心配している場合

+0

どちらの実装は、完全な偽です。最初のものは、不変なオブジェクト内部への非constポインタを返します。あなたがこれについて安全を感じるなら、あなたは[The Definitive C++ Book Guide and List](http://stackoverflow.com/q/388242/1889329)からいくつかの本を読む必要があります。 2つ目はメモリを破壊します。パフォーマンスについて懸念しており、正確性について気にしないので、どちらの実装を最適化しても時間がかからないようにするのは簡単です。また、パフォーマンスを測定できない場合は、とにかく気にしないでください。 – IInspectable

+0

@IInspectableあなたのアドバイスありがとうございます。 – 123iamking

答えて

0

、なぜ単にvsnprintf_s()を使用していません。 2番目の引数は、出力バッファに書き込まれる文字数を制限します。あなたは、この余分なsizeOfBufferフィールドを受け取り、vsnprintf_s()にそれを渡すためにあなたの「ToStringメソッド()」関数を変更することができます。

参照[詳細およびバッファオーバーランを防止するための他の方法のためにhttps://msdn.microsoft.com/en-us/library/d3xd30zz.aspx][1]

+0

しかし私の質問は、CString :: Format vs sprintf_sの欠点と利点です。あなたは完全に無視してCString :: Format – 123iamking

関連する問題