У меня есть программа на C, которая использует sprintf_s
. Он отлично работает в Windows, но когда я компилирую свой код в Linux, он выдает эту ошибку:
sprintf_s was not declared in this scope.
Почему это происходит и как я могу это исправить?
У меня есть программа на C, которая использует sprintf_s
. Он отлично работает в Windows, но когда я компилирую свой код в Linux, он выдает эту ошибку:
sprintf_s was not declared in this scope.
Почему это происходит и как я могу это исправить?
Это нестандартно, в Linux вы не найдете такой функции.
Стандартная функция snprintf
должна иметь аналогичную семантику.
sprintf_s
является частью расширений библиотеки C11 и необязательной реализацией.
- person Mgetz; 25.06.2015
snprintf
существует только с C++11, проблема все еще здесь, если вы ограничены в C++98.
- person Sandburg; 21.08.2018
sprintf_s не является частью стандартной библиотеки C, поэтому она не переносима, поэтому вы не можете использовать ее в Linux. НО у вас есть snprintf, который очень похож и должен помочь вам выполнить то, что вы хотите.
sprintf_s
является лишь частью Приложения K, дополнительного приложения к стандарту C11:
Приложение К
...
К.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
, который является частью основного стандарта. и предоставляет все необходимые функции.
sprintf_s
не является частью стандартной библиотеки C, и вы не сможете использовать ее в Linux.
Однако snprintf
является стандартным и должен выполнять ту же задачу.
scanf
или sscanf
и %n
и возвращаемое значение scanf
; прочитайте scanf(3)
- person Basile Starynkevitch; 02.11.2014
snprintf небезопасен, безопасен только sprintf_s. snprintf не гарантирует добавление последнего \0, что может привести к последующим переполнениям. посмотрите на https://github.com/rurban/safeclib для правильной реализации.
Во время переноса моей программы с 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;
}