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

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

sprintf_s was not declared in this scope.

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


person SPB    schedule 28.01.2011    source источник


Ответы (6)


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

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

person peoro    schedule 28.01.2011
comment
на самом деле сейчас это неправильно... sprintf_s является частью расширений библиотеки C11 и необязательной реализацией. - person Mgetz; 25.06.2015
comment
@Mgretz, не могли бы вы вставить имя пакета, если это не слишком сложно для вас .. - person Li3ro; 08.09.2015
comment
так одиноко... Я тоже хотел этот ответ :( - person MTeck; 06.10.2016
comment
snprintfсуществует только с C++11, проблема все еще здесь, если вы ограничены в C++98. - person Sandburg; 21.08.2018

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

person gnclmorais    schedule 28.01.2011

sprintf_s является лишь частью Приложения K, дополнительного приложения к стандарту C11:

Приложение К

...

К.2 Область применения

  1. В этом приложении указан ряд необязательных расширений, которые могут быть полезны для устранения уязвимостей безопасности в программах и включают новые функции, макросы и типы, объявленные или определенные в существующем стандарте. заголовки.

...

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

person Deduplicator    schedule 01.11.2014

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

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

person Alberto Soto Ballesteros    schedule 01.11.2014
comment
Вы можете использовать scanf или sscanf и %n и возвращаемое значение scanf; прочитайте scanf(3) - person Basile Starynkevitch; 02.11.2014

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

person rurban    schedule 16.10.2017
comment
snprintf небезопасен, безопасен только sprintf_s. snprintf не гарантирует добавление последнего \0 Не true: ... выходные символы после n-1 отбрасываются, а не записываются в массив, а нулевой символ записывается в конце символов, фактически записанных в массив. - person Andrew Henle; 17.11.2019

Во время переноса моей программы с 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;
}
person Andrey    schedule 13.06.2017
comment
Отсутствуют многие функции C11: проверка аргументов, обработка ошибок, проверки %n, ограничение. Возвращаемое значение не должно превышать sizeOfBuffer. - person rurban; 16.10.2017