Подтвердить что ты не робот

Разница между 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)

4b9b3361

Ответ 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, чтобы она "обрабатывала все предупреждения как ошибки". Измените конфигурацию, чтобы предупреждения были предупреждениями, и вы также можете просто игнорировать это предупреждение.