Sprintf_s не был объявлен в этой области

У меня есть программа на C, которая использует sprintf_s. Он отлично работает в Windows, но когда я компилирую свой код в Linux, он дает эту ошибку:

sprintf_s was not declared in this scope.

Почему это происходит и как я могу его исправить?

Ответы

Ответ 1

Это не стандартно, вы не найдете такую ​​функцию в Linux.

Стандартная функция snprintf должна иметь сходную семантику.

Ответ 2

sprintf_s не входит в стандартную библиотеку C, поэтому он не переносится, поэтому вы не можете использовать его в Linux. НО у вас есть snprintf, который очень похож, и он должен помочь вам выполнить то, что вы хотите.

Ответ 3

sprintf_s не входит в стандартную библиотеку C, и вы не сможете использовать его в Linux.

Однако snprintf является стандартным и должен выполнять ту же задачу.

Ответ 4

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, который является частью основного стандарта и предоставляет все необходимые функции.

Ответ 5

Во время переноса моей программы из 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;
}

Ответ 6

snprintf небезопасен, только sprintf_s безопасен. snprintf не гарантирует добавление окончательного \0, что приводит к возможным последующим переполнениям. посмотрите https://github.com/rurban/safeclib для правильной реализации.