Отвечая на этот вопрос, я скомпилировал код на Ideone и получил эту ошибку
implicit declaration of function ‘scanf_s’ [-Wimplicit-function-declaration]
Разве stdio.h
не является заголовком для scanf_s
?
Отвечая на этот вопрос, я скомпилировал код на Ideone и получил эту ошибку
implicit declaration of function ‘scanf_s’ [-Wimplicit-function-declaration]
Разве stdio.h
не является заголовком для scanf_s
?
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
__STDC_WANT_LIBC_EXT1__
(которая доступна только в том случае, если реализация определяет __STDC_LIBC_EXT1__
). На практике вы правы в том, что Microsoft является единственной платформой, на которой доступны функции (и, возможно, без необходимости в различных определениях). См. раздел Используете ли вы "безопасные" функции TR 24731? Чтобы получить больше информации.
- person Jonathan Leffler; 17.09.2013
scanf_s
не является нестандартным Microsoft-измом? - person Paul R   schedule 17.09.2013