Заголовок для функции scanf_s

Отвечая на этот вопрос, я скомпилировал код на Ideone и получил эту ошибку

implicit declaration of function ‘scanf_s’ [-Wimplicit-function-declaration]

Разве stdio.h не является заголовком для scanf_s?


person haccks    schedule 16.09.2013    source источник
comment
Кажется, в этом коде здесь   -  person smac89    schedule 17.09.2013
comment
Платформа, на которой вы компилируете, требует поддержки, прежде чем вы сможете ее использовать (очевидно). Само собой разумеется, что то, что вы используете, не имеет поддержку.   -  person WhozCraig    schedule 17.09.2013
comment
Разве scanf_s не является нестандартным Microsoft-измом?   -  person Paul R    schedule 17.09.2013


Ответы (1)


scanf_s относится к Microsoft. Заголовок stdio.h, но не в GCC.

Используется для чтения форматированных данных из стандартного потока ввода. Эти версии scanf,scanf_s, _scanf_l, wscanf, _wscanf_l have security enhancements

Где как Ideone uses GCC из-за этого только у тебя получилось undefined reference to scanf_s

В основном эту функцию можно найти в компиляторах на базе Windows, таких как
Visual Studio 2008 и Microsoft .NET 2010.

Здесь и Здесь Вы нашли интересную информацию о scanf_s

int scanf_s(
   const char *format [,
   argument]... 
);

Согласно справке MSDN:

Функция scanf_s считывает данные из стандартного потока ввода stdin и записывает данные в место, указанное аргументом. Каждый аргумент должен быть указателем на переменную типа, который соответствует спецификатору типа в формате. Если копирование происходит между перекрывающимися строками, поведение не определено.

В отличие от scanf, scanf_s требует указания размера буфера для всех входных параметров типа c, C, s, S или [. Размер буфера передается как дополнительный параметр сразу после указателя на буфер или переменную. Например, при чтении строки размер буфера для этой строки передается следующим образом:

char s[10];

scanf_s("%9s", s, 10);

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

In the case of characters, one may read a single character as follows:

char c;

scanf_s("%c", &c, 1);  

При чтении нескольких символов для строк, не заканчивающихся нулем, целые числа используются в качестве спецификации ширины и размера буфера.

char c[4];

scanf_s("%4c", &c, 4); // not null terminated
person Gangadhar    schedule 16.09.2013
comment
Технически это необязательная функция C11, определенная в Приложении K и включенная путем определения __STDC_WANT_LIBC_EXT1__ (которая доступна только в том случае, если реализация определяет __STDC_LIBC_EXT1__). На практике вы правы в том, что Microsoft является единственной платформой, на которой доступны функции (и, возможно, без необходимости в различных определениях). См. раздел Используете ли вы "безопасные" функции TR 24731? Чтобы получить больше информации. - person Jonathan Leffler; 17.09.2013
comment
символ с[4]; scanf_s(%4c, &c, 4); // не заканчивается нулем ===› не должен &c -› c ?? - person kwagjj; 15.06.2015