質問

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';

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

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

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

役に立ちましたか?

解決

C99標準から:

sprintf関数は、終端のnull文字をカウントせず、エンコードエラーが発生した場合は負の値をカウントせずに、配列で記述された文字の数を返します。

これは通常、マルチバイトと幅広の文字セット関数でのみ発生します。

他のヒント

たとえば、間違った形式の文字列で失敗する可能性がありますが、これはあなたの場合では起こり得ません。

バッファーが十分に大きくない場合、それはそうかもしれません。

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

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

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

 EINVAL
       There are insufficient arguments.

eilseqはすでに言及されています。

また、形式指定器がデータと一致しない場合、sigsegvにも失敗する可能性があります - int、32ビットの例を持つ%s形式仕様を使用した例:

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

sprintf(tmp, "%s", pdq);

snprintf()が成功できない別のケースがあると思います。 POSIXまたは現在のLinuxマンページで言及されていないようです。

正常に完了すると、snprintf()関数は、終端nullバイトを除外して十分に大きくなっていれば、sに書き込まれるバイト数を返します。

snprintf()returns int. 。ただし、入力文字列はより大きくなる可能性があります INT_MAX.

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