std::ostringstream
или std::to_string
(c ++ 11) работает как альтернатива, но если вам требуется более эффективное решение без лишних копий или у вас есть только C, а не C ++, вам может потребоваться сделать что-то еще:
MSVC не поддерживает C99 и поэтому имеет не snprintf
функцию, а только самодельную:
_snprintf
.
Различия между MSVC _snprintf
и официальным C99 (gcc, clang) snprintf
:
Возвращаемое значение:
- MSVC: вернуть -1, если размера буфера недостаточно для записи всего (не включая завершение нуля!)
- GCC: вернуть количество символов, которое было бы записано, если бы буфер был достаточно большим
Письменные байты:
- MSVC: писать как можно больше, не писать NULL в конце, если не осталось места
- GCC: писать как можно больше, всегда писать завершающий NULL (исключение: buffer_size = 0)
Интересно %n
Тонкость:
Если вы используете %n
в своем коде, MSVC оставит его унифицированным! если он прекращает синтаксический анализ, поскольку размер буфера слишком мал, GCC всегда будет записывать количество байтов, которое было бы записано, если бы буфер был достаточно большим.
Поэтому я бы предложил написать собственную функцию-оболочку mysnprintf
с использованием vsnprintf
/ _vsnprintf
, которая дает одинаковые возвращаемые значения и записывает одинаковые байты на обеих платформах (будьте осторожны: %n
исправить сложнее ).