6

swprintf を使用して文字列をバッファに作成しています (特にループを使用しています)。

const int MaxStringLengthPerCharacter = 10 + 1;
wchar_t* pTmp = pBuffer;
for ( size_t i = 0; i < nNumPlayers ; ++i)
{
    const int nPlayerId = GetPlayer(i);
    const int nWritten = swprintf(pTmp, MaxStringLengthPerCharacter, TEXT("%d,"), nPlayerId);
    assert(nWritten >= 0 );
    pTmp += nWritten;
}

*pTaskPlayers = '\0';

テスト中にアサートがヒットしない場合、実際のコードではヒットしないと確信できますか? つまり、nWritten < 0 であるかどうかを確認して処理する必要がありますか?それとも、問題がないと安全に想定できますか?

どのような状況で -1 を返すことができますか? ドキュメントには、多かれ少なかれ「関数が失敗した場合」と記載されています。ある場所で、引数(つまり、フォーマット文字列と可変引数)が一致しない場合に失敗することを読んだことがありますが、それは心配ありません。

この場合、バッファ オーバーランについても心配していません。バッファが十分に大きいことはわかっています。

4

4 に答える 4

6

c99 標準から:

sprintf 関数は、配列に書き込まれた文字数を返します。ただし、末尾の null 文字はカウントされません。エンコード エラーが発生した場合は負の値が返されます。

これは通常、マルチバイトおよびワイド文字セット関数でのみ発生します。

于 2010-06-01T09:11:00.703 に答える
2

たとえば、あなたのケースでは起こり得ない、間違ったフォーマット文字列で失敗する可能性があります。

バッファが十分に大きくない場合は、可能性があります。

そうでなければ、失敗する理由はありません。

于 2010-06-01T08:53:12.360 に答える
2

UNIX では、失敗する可能性があります。

 EILSEQ
       A wide-character code that does not  correspond  to  a
       valid character has been detected.

 EINVAL
       There are insufficient arguments.

EILSEQ については既に説明しました。

フォーマット指定子がデータと一致しない場合、SIGSEGV も失敗する可能性があります - %s フォーマット指定子を int、32 ビットの例で使用する例:

int pdq=0xffffffff;
char tmp[32]={0x0};

sprintf(tmp, "%s", pdq);
于 2010-06-06T16:25:34.277 に答える