Вопрос

Я использую 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';

Если во время тестирования утверждения никогда не попадает, я могу быть уверен, что он никогда не ударит в Live Code? То есть мне нужно проверить, есть ли NWrite <0 и справиться с этим, или я могу безопасно предположить, что не будет проблем?

При каких обстоятельствах он может вернуть -1? Документация более или менее только гласит: «Если функция не удалась». В одном месте я прочитал, что он не удастся, если он не сможет сопоставить аргументы (то есть строка форматирования к вараркам), но это не беспокоит.

Я также не беспокоюсь о переполнении буфера в этом случае - я знаю, что буфер достаточно большой.

Это было полезно?

Решение

Из стандарта 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 или текущем Manux Linux.

После успешного завершения функция SNPRINTF () должна вернуть число байтов, которые будут записаны на S, было достаточно большим, исключая прекращению расторжения NULL BYTE.

SNPRINTF () возвращается int. Отказ Но входная строка может быть больше, чем INT_MAX.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top