LINUX.ORG.RU

История изменений

Исправление xaizek, (текущая версия) :

Народ говорит что проблема связана с тем, что при передачи в "..." float преобразуется к double.

Народ что-то говорит правильно, но понимает это плохо. Проблема не в этом, так как snprintf не глуп и понимает, что там будет double, а он там будет и во втором случае.

Проблема в повторном использовании va_list, так делать нельзя, его надо копировать, чтобы можно было использовать дважды. Можно сказать, что он работает как forward iterator.

std::string strprintf(const char* format, ...)
{
va_list argptr;
va_list argptr2;
std::vector<char> buffer;

    va_start(argptr, format);
    va_copy(argptr2, argptr);

    std::size_t length = vsnprintf(NULL, 0, format, argptr)+1;
    va_end(argptr);
    buffer.resize(length, 0);

    vsnprintf(&buffer[0], buffer.size(), format, argptr2);
    va_end(argptr2);

return std::string(buffer.begin(), buffer.end() );
}

Исправление xaizek, :

Народ говорит что проблема связана с тем, что при передачи в "..." float преобразуется к double.

Народ что-то говорит правильно, но понимает это плохо. Проблема не в этом, так как snprintf не глуп и понимает, что там будет double и он там будет и во втором случае.

Проблема в повторном использовании va_list, так делать нельзя, его надо копировать, чтобы можно было использовать дважды. Можно сказать, что он работает как forward iterator.

std::string strprintf(const char* format, ...)
{
va_list argptr;
va_list argptr2;
std::vector<char> buffer;

    va_start(argptr, format);
    va_copy(argptr2, argptr);

    std::size_t length = vsnprintf(NULL, 0, format, argptr)+1;
    va_end(argptr);
    buffer.resize(length, 0);

    vsnprintf(&buffer[0], buffer.size(), format, argptr2);
    va_end(argptr2);

return std::string(buffer.begin(), buffer.end() );
}

Исходная версия xaizek, :

Народ говорит что проблема связана с тем, что при передачи в "..." float преобразуется к double.

Народ что-то говорит правильно, но понимает это плохо. Проблема не в этом, так как snprintf не глуп и понимает, что там будет double и он там будет и во втором случае.

Проблема в повторном использовании va_list, так делать нельзя, его надо копировать, чтобы можно было использовать дважды. Можно сказать, что он работает как forward iterator.

std::string strprintf(const char* format, ...)
{
va_list argptr;
va_list argptr2;
std::vector<char> buffer;

    va_start(argptr, format);
    va_copy(argptr2, argptr);

    std::size_t length = vsnprintf(NULL, 0, format, argptr)+1;
    buffer.resize(length, 0);

    vsnprintf(&buffer[0], buffer.size(), format, argptr2);
    va_end(argptr);

return std::string(buffer.begin(), buffer.end() );
}