Ответ 1
Это не стандартно, вы не найдете такую функцию в Linux.
Стандартная функция snprintf
должна иметь сходную семантику.
У меня есть программа на C, которая использует sprintf_s
. Он отлично работает в Windows, но когда я компилирую свой код в Linux, он дает эту ошибку:
sprintf_s was not declared in this scope.
Почему это происходит и как я могу его исправить?
Это не стандартно, вы не найдете такую функцию в Linux.
Стандартная функция snprintf
должна иметь сходную семантику.
sprintf_s не входит в стандартную библиотеку C, поэтому он не переносится, поэтому вы не можете использовать его в Linux. НО у вас есть snprintf, который очень похож, и он должен помочь вам выполнить то, что вы хотите.
sprintf_s
не входит в стандартную библиотеку C, и вы не сможете использовать его в Linux.
Однако snprintf
является стандартным и должен выполнять ту же задачу.
sprintf_s
является лишь частью Приложения K, дополнительного приложения к стандарту C11:
Приложение K
...
K.2 Область действия
- В этом приложении описывается серия дополнительных расширений, которые могут быть полезны при смягчении уязвимостей безопасности в программах и включают новые функции, макросы и типы объявленные или определенные в существующих стандартных заголовках.
...
K.3.5.3.6 Функция sprintf_s
Сводка
#define __STDC_WANT_LIB_EXT1__1 #include <stdio.h> int sprintf_s(char * restrict s, rsize_t n, const char * restrict format, ...);
(выделено курсивом)
Он никогда не попадал в POSIX (или Linux) (и вообще не пропущен, есть даже аргументы в пользу его полезности в комитете).
Для лучшей переносимости используйте snprintf
, который является частью основного стандарта и предоставляет все необходимые функции.
Во время переноса моей программы из Windows в Linux я написал следующую реализацию в моем собственном windows.h:
inline int sprintf_s(char* buffer, size_t sizeOfBuffer, const char* format, ...)
{
va_list ap;
va_start(ap, format);
int result = vsnprintf(buffer, sizeOfBuffer, format, ap);
va_end(ap);
return result;
}
template<size_t sizeOfBuffer>
inline int sprintf_s(char (&buffer)[sizeOfBuffer], const char* format, ...)
{
va_list ap;
va_start(ap, format);
int result = vsnprintf(buffer, sizeOfBuffer, format, ap);
va_end(ap);
return result;
}
snprintf небезопасен, только sprintf_s безопасен. snprintf не гарантирует добавление окончательного \0, что приводит к возможным последующим переполнениям. посмотрите https://github.com/rurban/safeclib для правильной реализации.