sprintf_s не был объявлен в этой области - PullRequest
19 голосов
/ 28 января 2011

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

sprintf_s was not declared in this scope.

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

Ответы [ 6 ]

29 голосов
/ 28 января 2011

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

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

7 голосов
/ 28 января 2011

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

6 голосов
/ 02 ноября 2014

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

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

4 голосов
/ 02 ноября 2014

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

Приложение К

...

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

1 голос
/ 16 октября 2017

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

0 голосов
/ 13 июня 2017

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