Есть ли разница между функцией vsnprintf в xcode и vsnprintf на других платформах?

Я написал очень простой тестовый код для 9X_visual-studio проверки vsnprintf, но в среде xcode и Visual 9X_c++ Studio результаты сильно различаются. Код 9X_fprintf теста выглядит следующим образом:

#define  _CRT_SECURE_NO_WARNINGS
#include 
#include 
#include 


void p(const char* fmt, ...)
{
    static const int DefaultLength = 256;
    char defaultBuf[DefaultLength] = { 0 };
    
    va_list args;
    va_start(args, fmt);
    
    vsprintf(defaultBuf, fmt, args);
    printf("%s\n", defaultBuf);
    
    memset(defaultBuf, 0, sizeof(defaultBuf));
    vsnprintf(defaultBuf, DefaultLength, fmt, args);
    printf("%s\n", defaultBuf);
    va_end(args);
}

int main(int argc, const char* argv[])
{
    // if you uncomment this line(std::cout ...), it will crash at vsnprintf in xcode
    std::cout << "Tests...!\n";
    
    p("Create:%s(%d)", "I'm A String", 0x16);

    return 0;
}

это вывод 9X_vswprintf в Visual Studio:

Tests...!
Create:I'm A String(22)
Create:I'm A String(22)

Это нормально и не является 9X_c++ проблемой. Но тот же код, я создал проект 9X_visual-studio-community командной строки macos, вставил этот код, произошло 9X_c++ что-то странное, когда код выполняется для 9X_c vsnprintf, он запускает EXC_BAD_ACCESS напрямую.

9X_Есть ли разница между функцией vsnprintf в xcode и vsnprintf на других платформах?_printf Что 9X_c++ более возмутительно, так это то, что если 9X_xcode я закомментирую std::cout в основной функции, она 9X_sprintf не рухнет, но выведет неверный результат. Итак, вопрос 9X_vswprintf в том, в чем причина этой разницы, не должны 9X_vs.net ли все эти функции быть функциями стандартной 9X_snprintf библиотеки C, и их поведение должно ограничиваться 9X_fprintf стандартной библиотекой? Или мое использование 9X_c++ неправильно? вывод, когда я удаляю std::cout:

Create:I'm A String(22)
Create:\310\366\357\277\367(3112398)
Program ended with exit code: 0

9X_Есть ли разница между функцией vsnprintf в xcode и vsnprintf на других платформах?_fprintf

Если 9X_fprintf только один правильный, правильный ли xcode 9X_printf или визуальная студия, в конце концов, я 9X_sprintf использовал последнюю версию xcode 14, visual 9X_vswprintf studio 2022。

2
0
1
Общее количество ответов: 1

Ответ #1

Ответ на вопрос: Есть ли разница между функцией vsnprintf в xcode и vsnprintf на других платформах?

Вы должны повторно инициализировать va_list между 9X_c++ вызовами vsprintf. Невыполнение этого требования 9X_vsprintf является неопределенным поведением.

См. https://en.cppreference.com/w/c/variadic/va_list :

Если 9X_printf экземпляр va_list создается, передается другой 9X_vsnprintf функции и используется через va_arg в этой 9X_snprintf функции, то любому последующему использованию 9X_printf в вызывающей функции должен предшествовать 9X_vswprintf вызов va_end.

void p(const char* fmt, ...)
{
    static const int DefaultLength = 256;
    char defaultBuf[DefaultLength] = { 0 };
    
    va_list args;
    va_start(args, fmt);
    vsprintf(defaultBuf, fmt, args);
    va_end(args);

    printf("%s\n", defaultBuf);
    
    memset(defaultBuf, 0, sizeof(defaultBuf));
    va_start(args, fmt);
    vsnprintf(defaultBuf, DefaultLength, fmt, args);
    va_end(args);

    printf("%s\n", defaultBuf);
}

11
0