我正在使用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';

如果在测试断言期间永远不会命中,我是否可以确定它永远不会在现场代码中击中?也就是说,我是否需要检查是否<0并处理它,还是可以安全地假设没有问题?

在哪些情况下可以返回-1?该文档或多或少只是指出“如果功能失败”。在一个地方,我读到,如果无法匹配参数(即格式字符串与varargs),那将失败,但这并不让我担心。

在这种情况下,我也不担心缓冲区超支 - 我知道缓冲区足够大。

有帮助吗?

解决方案

根据C99标准:

sprintf函数返回数组中写入的字符数,不计算终止空字符,或者如果发生编码错误,则为负值。

通常,这只有多字节和广泛的字符集函数才会发生。

其他提示

例如,在您的情况下,它可能会因错误的格式字符串而失败。

如果缓冲区不够大,则可能。

否则,没有理由失败。

在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);

我相信另一种情况下,snprintf()无法成功。它似乎在POSIX或当前Linux manpage中没有提及。

成功完成后,snprintf()函数应返回如果n足够大的终端null字节数足够大,将返回将写给s的字节数。

snprintf()返回 int. 。但是输入字符串可能大于 INT_MAX.

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top