Есть ли разница между функцией 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_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_fprintf только один правильный, правильный ли xcode 9X_printf или визуальная студия, в конце концов, я 9X_sprintf использовал последнюю версию xcode 14, visual 9X_vswprintf studio 2022。
Ответ #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);
}
-
2
-
10
-
6
-
6
-
10
-
8
-
4
-
5
-
4
-
5
-
8
-
6
-
2
-
5
-
5
-
15
-
3
-
5
-
7
-
1
-
3
-
5
-
3
-
6
-
5
-
6
-
4
-
6
-
4
-
3
-
4
-
2
-
8
-
7
-
4
-
4
-
3
-
3
-
4
-
8
-
4
-
4
-
7
-
5
-
3
-
2
-
2
-
3
-
2
-
5