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