Есть ли разница между функцией 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 2023。

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