Разница между scanf и scanf_s
В чем разница между scanf
и scanf_s
? В университете меня учили и я использую scanf
, но на моем персональном компьютере Visual Studio продолжает посылать это предупреждение.
error C4996: 'scanf': This function or variable may be unsafe. Consider using scanf_s instead.
И я должен изменить все scanf
на scanf_s
иначе программа не будет scanf_s
. (Я использую Visual Studio 2013)
Ответы
Ответ 1
Это функция, которая относится к компилятору Microsoft.
scanf
изначально просто считывает любой ввод в консоль, который вы вводите, и назначайте его типу переменной.
Если у вас есть массив с именем first_name[5]
, и вы используете scanf
для "Alex", проблем нет. Если у вас есть тот же массив и назначить "Александр", вы можете увидеть, что он превышает 5 слотов, которые содержит массив, поэтому C все равно будет записывать его в память, которая не принадлежит к массиву, и может или не может сбой программы, в зависимости от того, что-то пытается получить доступ и записать в этот слот памяти, который не принадлежит первому. Здесь scanf_s
входит.
scanf_s
имеет аргумент (параметр), где вы можете указать размер буфера и фактически контролировать предел ввода, чтобы вы не разбивали все здание.
Ответ 2
scanf_s()
не описывается стандартом C99 (или предыдущими).
Если вы хотите использовать компилятор, который нацелен на C99 (или предыдущий), используйте scanf()
.
Для C11 Standard (и в конечном итоге более поздних) scanf_s()
гораздо труднее использовать, чем scanf()
для повышения безопасности при переполнении буфера.
C11 fscanf_s()
: http://port70.net/~nsz/c/c11/n1570.html#K.3.5.3.2
~~~~~~~~~~~~~~~~
Если у вас есть компилятор C99 с дополнительными функциями, который предоставляет scanf_s()
в качестве расширения и не против потери переносимости, проверьте свою документацию компилятора.
Ответ 3
Что вы можете сделать, чтобы избежать этой ошибки, это вставить элемент между < > :
< _CRT_SECURE_NO_WARNINGS > к месту.
Чтобы добраться до места, щелкните правой кнопкой мыши на своем проекте в проводнике решений и нажмите на свойства. затем перейдите к свойствам конфигурации, затем c/С++, затем препроцессор. затем в определениях препроцессора, после всего, добавьте точку с запятой и вставьте ее. Затем нажмите "Применить" и "ОК". Ваша проблема должна быть решена.
Ответ 4
BTW, причина, по которой ваш компилятор дает вам ошибку, и останавливается, а не "предупреждение", на самом деле это проблема, заключается в том, что у вас должна быть настройка Visual Studio, чтобы она "обрабатывала все предупреждения как ошибки". Измените конфигурацию, чтобы предупреждения были предупреждениями, и вы также можете просто игнорировать это предупреждение.