Scanf this function or variable may be unsafe как исправить

от admin

Как заставить работать scanf?

После добавления
#define _CRT_SECURE_NO_WARNINGS
ничего не меняется.
А при использовании scanf_s, программа запускается но после ввода значения выкидывает такую ошибку:
dadd1062d568496b8a2b5a511177299f.png

  • Вопрос задан более трёх лет назад
  • 14859 просмотров
  • Facebook
  • Вконтакте
  • Twitter
  • Facebook
  • Вконтакте
  • Twitter
  • Facebook
  • Вконтакте
  • Twitter

Добавлять нужно в самом начале файла, до подключения любых заголовочных файлов.

И самое главное: у вас есть один char, в котором есть место для одного символа. При чтении в %s, сохранено будет как минимум два — символ и завершающий 0.

[Solved] VS error C4996: ‘scanf’: This function or variable may be unsafe.

Compile the C language project in VS, if the scanf function is used, the following error will be prompted when compiling:

error C4996:’scanf’: This function or variable may be unsafe. Consider using scanf_s instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.

The reason is that Visual C++ uses more secure run-time library routines. The new Security CRT functions (that is, those with the “_s” suffix), please see

The solution to this problem is given below:

Method 1 : Replace the original old functions with new Security CRT functions.

Method 2 : Use the following methods to block this warning:

  1. Define the following macros in the precompiled header file stdafx.h (note: it must be before including any header files):
  1. Or statement

Method three : Method two does not use the more secure CRT function, which is obviously not a good method worth recommending, but we don’t want to change the function names one by one. Here is an easier method:

Define the following macros in the precompiled header file stdafx.h (also before including any header files):

When linking, it will automatically replace the old functions with Security CRT functions.

Note: Although this method uses a new function, it cannot eliminate the warning. You have to use method two (-_-) at the same time. In other words, the following two sentences should actually be added to the precompiled header file stdafx.h:

Explanation of the cause of the error:

This kind of warning from Microsoft is mainly because of the functions of the C library. Many functions do not perform parameter detection (including out-of-bounds). Microsoft is worried that using these will cause memory exceptions, so it rewrites the functions of the same function. The function of has carried out parameter detection, and it is safer and more convenient to use these new functions. You don’t need to memorize these rewritten functions specifically, because the compiler will tell you the corresponding safe function when it gives a warning for each function. You can get it by checking the warning message. You can also check MSDN for details when you use it.

Русские Блоги

Функция Scanf () и функция scanf_s () в Visual Studio 2019

описание проблемы

error C4996: ‘scanf’: This function or variable may be unsafe. Consider using scanf_s instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.

Это означает, что функция или переменная scanf могут быть небезопасными. Вместо этого рекомендуется рассмотреть возможность использования функции scanf_s. Чтобы не отображать инструкции по устареванию (следует обратиться к этому сообщению об ошибке), вы можете использовать _CRT_SECURE_NO_WARNINGS. За подробностями обращайтесь к интерактивной справке.

Анализ проблем и сравнение функций

функция scanf ()

Функция scanf () — это функция в ANSI C. Она не проверяет границу при чтении, поэтому может вызвать доступ к памяти вне допустимого диапазона. Например, выделяется 5 байтов пространства, но читается 10 байтов, как показано ниже:

Если вы введете 1234567890, 567890 будет записан в другое пространство, что приведет к аварийному запуску программы.

функция scanf_s ()

Чтобы предотвратить «scanf () не проверяет границу при чтении строки, что может вызвать утечку памяти» и привести к ненормальному запуску программы. Начиная с VS2005, Microsoft VS предоставляет функцию scanf_s (). Его функция такая же, как и у исходной функции scanf (), за исключением того, что когда вызывается функция scanf_s (),Необходимо указать число, чтобы указать максимальное количество символов для чтения во избежание переполнения.

Читать:
Как установить wing 101 на linux

Если в приведенном выше коде используется функция scanf_s (), вторая строка должна быть изменена на:

Это означает чтение не более 4 символов, потому что buf [4] должен помещать «\ 0». Последний параметр n функции scanf_s () — это размер буфера, что означает, что можно прочитать не более n-1 символов. При использовании функции scanf_s () для чтения одного символа также необходимо ограничить длину, которая записывается следующим образом.

подводить итоги

Функция scanf () — это исходная функция ввода, а функция scanf_s () — уникальная функция Microsoft VS. Оба имеют одинаковые функции, но последний более безопасен и надежен.

Повторное использование

При программировании на VS напишите в первой строке следующий оператор.

#define _CRT_SECURE_NO_WARNINGS С этого момента вы можете использовать функцию scanf () как обычно.

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

  • Найдите проект в строке меню → Свойства проекта → C / C ++ → препроцессор
  • Справа есть определение препроцессора, добавьте к его параметрам _CRT_SECURE_NO_WARNINGS

    3. Если два вышеупомянутых метода по-прежнему вызывают затруднения, существует третий метод. Найдите элемент в строке меню, найдите свойства проекта, найдите C / C ++, найдите генерацию кода, в генерации кода есть проверка безопасности, измените проверку безопасности, чтобы отключить проверку безопасности.

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

Интеллектуальная рекомендация

Реализация JavaScript Hashtable

причина Недавно я смотрю на «Структуру данных и алгоритм — JavaScript», затем перейдите в NPMJS.ORG для поиска, я хочу найти подходящую ссылку на библиотеку и записывать его, я могу исполь.

MySQL общие операции

jdbc Транзакция: транзакция, truncate SQL заявление Transaction 100 000 хранимая процедура mysql msyql> -определить новый терминатор,Пробелов нет mysql>delimiter // mysql> -создание хранимой .

Используйте Ansible для установки и развертывания TiDB

жизненный опыт TiDB — это распределенная база данных. Настраивать и устанавливать службы на нескольких узлах по отдельности довольно сложно. Чтобы упростить работу и облегчить управление, рекомендуетс.

Последняя версия в 2019 году: использование nvm под Windows для переключения между несколькими версиями Node.js.

С использованием различных интерфейсных сред вы можете переключаться между разными версиями в любое время для разработки. Например, развитие 2018 года основано наNode.js 7x версия разработана. Тебе эт.

Шаблон проектирования — Создать тип — Заводской шаблон

Заводская модель фабрикиPattern Решать проблему: Решен вопрос, какой интерфейс использовать принципСоздайте интерфейс объекта, класс фабрики которого реализуется его подклассом, чтобы процесс создания.

Ошибка работы функции scanf в си

Здравствуйте. При попытке компиляции проекта возникает следующая ошибка:

Ошибка C4996 ‘scanf’: This function or variable may be unsafe. Consider using scanf_s instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details. код программы:

P.S: при использовании scanf_s компиляция проходит успешно, почему не работает с scanf ? Среда разработки visual studio

Ответы (2 шт):

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

Поэтому вас предупреждают об использовании потенциально небезопасной функции.

вы говорите — да, я знаю и принимаю на себя всю ответственность.

Это диагностическое сообщение является «ошибкой» только если у вас в установках проекта включены SDL Checks . Если выключить SDL Checks , то «ошибка» превратится в «предупреждение».

Чтобы избавиться от него полностью, определите макро _CRT_SECURE_NO_WARNINGS перед включением стандартных заголовочных файлов. Лучше всего сделать это глобально, в настройках проекта.

Related Posts