2 Августа 2017
Время чтения: 5 минут
Компилятор в Visual Studio сильно отличается от привычных большинству программистов GCC или CLANG, из-за чего при написании кода на C или C++ очень часто возникают неожиданные проблемы в виде ошибки использования стандартных функций, например, scanf, fopen, sscanf и тому подобным. Студия предлагает заменять функции на безопасные (повезёт, если нужно просто добавить _s к функции с ошибкой, но нередко в этих функциях идёт иной набор аргументов, нежели в обычной программе). Если вы не готовы с этим мириться, то этот пост для вас!
Давайте для начала создадим обычный консольный проект в Visual Studio и напишем простенькую программу, которая запрашивает ввод двух чисел, вводит их и затем выводит на экран.
#include "stdafx.h" #include <stdio.h> int main() { int a, b; printf("Enter a: "); scanf("%d", &a); printf("Enter b: "); scanf("%d", &b); printf("a: %d, b: %dn", a, b); return 0; }
Попробовав выполнить сборку проекта, обнаружим те самые ошибки.
Чтобы Visual Studio не тратила ваши нервы, сделаем следующее:
1. Выберем пункт «Проект» в верхнем меню
2. В открывшемся списке щёлкнем по «Свойства название_проекта»
Программа, вводящая два числа и выводящая их
Ошибка компиляции из-за небезопасности функций
Проект — Свойства {навание проекта}
3. В появившемся окне выберем Свойства конфигурации
, C/C++
, Препроцессор
4. В строке Определения препроцессора
допишем в самый конец строку ;_CRT_SECURE_NO_WARNINGS
5. Нажмём ОК
Свойства конфигурации
Определения препроцессора
Нажимаем OK
6. Попробуем заново выполнить сборку проекта:
Успешная сборка проекта
Ошибки исчезли, сборка прошла успешно и программа прекрасно работает! Теперь можно писать код как обычно, не переживая о необычном поведении Visual Studio!
Программист, сооснователь programforyou.ru, в постоянном поиске новых задач и алгоритмов
Языки программирования: Python, C, C++, Pascal, C#, Javascript
Выпускник МГУ им. М.В. Ломоносова
I have created a small application to find max number by using user-defined function with parameter. When I run it, it shows this message
Error 1 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.
What do I do to resolve this?
This is my code
#include<stdio.h>
void findtwonumber(void);
void findthreenumber(void);
int main() {
int n;
printf("Fine Maximum of two numbern");
printf("Fine Maximum of three numbern");
printf("Choose one:");
scanf("%d", &n);
if (n == 1)
{
findtwonumber();
}
else if (n == 2)
{
findthreenumber();
}
return 0;
}
void findtwonumber(void)
{
int a, b, max;
printf("Enter a:");
scanf("%d", &a);
printf("Enter b:");
scanf("%d", &b);
if (a>b)
max = a;
else
max = b;
printf("The max is=%d", max);
}
void findthreenumber(void)
{
int a, b, c, max;
printf("Enter a:");
scanf("%d", &a);
printf("Enter b:");
scanf("%d", &b);
printf("Enter c:");
scanf("%d", &c);
if (a>b)
max = a;
else if (b>c)
max = b;
else if (c>a)
max = c;
printf("The max is=%d", max);
}
При использовании scanf выдаёт ошибку:
char str;
printf("qwe");
scanf("%s", &str);
return 0;
Ошибка 2 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. e:decanatconsoleapplication15consoleapplication15consoleapplication15.cpp 11 1 ConsoleApplication15
После добавления#define _CRT_SECURE_NO_WARNINGS
ничего не меняется.
А при использовании scanf_s, программа запускается но после ввода значения выкидывает такую ошибку:
0 / 0 / 0 Регистрация: 28.04.2011 Сообщений: 18 |
|
1 |
|
09.05.2011, 18:28. Показов 99622. Ответов 21
warning 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. подскажите как исправить =(
0 |
Programming Эксперт 94731 / 64177 / 26122 Регистрация: 12.04.2006 Сообщений: 116,782 |
09.05.2011, 18:28 |
21 |
resource2008 111 / 112 / 18 Регистрация: 11.03.2011 Сообщений: 421 |
||||
09.05.2011, 21:33 |
2 |
|||
использовать
и это не ошибка, а предупреждение.
2 |
600 / 568 / 104 Регистрация: 07.11.2010 Сообщений: 2,004 |
|
09.05.2011, 22:06 |
3 |
warning 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. подскажите как исправить =( это майкрософт типа говорит использовать, но это не относится к стандарту, не юзайте
0 |
0 / 0 / 0 Регистрация: 28.04.2011 Сообщений: 18 |
|
10.05.2011, 00:30 [ТС] |
4 |
спасибо)
0 |
0 / 0 / 0 Регистрация: 13.09.2012 Сообщений: 13 |
|
12.10.2012, 07:45 |
5 |
это майкрософт типа говорит использовать, но это не относится к стандарту, не юзайте таак, а если у меня из-за этой ошибки не компилируется? чо делать? а, тьфу, дошло, спасибо
0 |
831 / 639 / 101 Регистрация: 20.08.2013 Сообщений: 2,524 |
|
20.09.2013, 20:35 |
6 |
А у меня почему-то в новом проекте VS2012 выдала 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. С какого перепуга оно стало ошибкой, а не предупреждением? Да, #define _CRT_SECURE_NO_WARNINGS решает проблему, но всё-таки весьма неприятно получить такую ошибку… Есть другие способы борьбы с ней? Добавлено через 6 минут error C4146: unary minus operator applied to unsigned type, result still unsigned тоже стали ошибками Похоже с настройками что-то…
0 |
5496 / 4891 / 831 Регистрация: 04.06.2011 Сообщений: 13,587 |
|
20.09.2013, 20:39 |
7 |
Не знаю, как в 12, но в 10, в свойствах проекта — С++ — Общие, есть пункт: Обрабатывать предупреждения как ошибки.
1 |
831 / 639 / 101 Регистрация: 20.08.2013 Сообщений: 2,524 |
|
20.09.2013, 22:18 |
8 |
Не знаю, как в 12, но в 10, в свойствах проекта — С++ — Общие, есть пункт: Обрабатывать предупреждения как ошибки. В ПН проверю. А как он оказался включенным в только что созданном проекте? Это где-то в настройках студии?
0 |
5496 / 4891 / 831 Регистрация: 04.06.2011 Сообщений: 13,587 |
|
20.09.2013, 22:32 |
9 |
А как он оказался включенным в только что созданном проекте? Это где-то в настройках студии? ….
Не знаю, как в 12
в 10, в свойствах проекта — С++ — Общие, есть пункт: Обрабатывать предупреждения как ошибки.
0 |
831 / 639 / 101 Регистрация: 20.08.2013 Сообщений: 2,524 |
|
20.09.2013, 22:41 |
10 |
в 10, в свойствах проекта — С++ — Общие, есть пункт: Обрабатывать предупреждения как ошибки. Я спросил, как настраивается его состояние при создании нового проекта.
0 |
5496 / 4891 / 831 Регистрация: 04.06.2011 Сообщений: 13,587 |
|
20.09.2013, 22:50 |
11 |
Я спросил, как настраивается его состояние при создании нового проекта. Всё что знаю — написал.
0 |
831 / 639 / 101 Регистрация: 20.08.2013 Сообщений: 2,524 |
|
13.12.2013, 17:32 |
12 |
Я спросил, как настраивается его состояние при создании нового проекта. Сам разобрался — см. скриншот. PS: Перечислю тех, кого это может интересовать, чтобы они получили уведомления: alsav22, Oceloto, max_besheniy, Sveta073, ranebull. Миниатюры
6 |
5496 / 4891 / 831 Регистрация: 04.06.2011 Сообщений: 13,587 |
|
13.12.2013, 17:37 |
13 |
Это при создании проекта консоль Win32? А если пустой создавать?
0 |
545 / 378 / 56 Регистрация: 23.06.2013 Сообщений: 1,181 Записей в блоге: 6 |
|
13.12.2013, 18:16 |
14 |
Это при создании проекта консоль Win32? А если пустой создавать? Да, это ситуация при создании проекта консоль Win32. При создании пустого проекта выдаются лишь предупреждения.
0 |
5496 / 4891 / 831 Регистрация: 04.06.2011 Сообщений: 13,587 |
|
13.12.2013, 18:42 |
15 |
При создании пустого проекта выдаются лишь предупреждения. Это точно? 12 или 13 студия? Проверено?
0 |
545 / 378 / 56 Регистрация: 23.06.2013 Сообщений: 1,181 Записей в блоге: 6 |
|
13.12.2013, 18:47 |
16 |
Это точно? 12 или 13 студия? Проверено? Скриншоты Миниатюры
1 |
5496 / 4891 / 831 Регистрация: 04.06.2011 Сообщений: 13,587 |
|
13.12.2013, 19:18 |
17 |
А там нет, как в 10, создание пустого проекта (Общие — Пустой), без всяких окон мастера?
0 |
25 / 25 / 5 Регистрация: 21.11.2013 Сообщений: 208 |
|
13.12.2013, 19:18 |
18 |
Сам разобрался — см. скриншот. PS: Перечислю тех, кого это может интересовать, чтобы они получили уведомления: alsav22, Oceloto, max_besheniy, Sveta073, ranebull. Почему я получил уведомление?
0 |
5496 / 4891 / 831 Регистрация: 04.06.2011 Сообщений: 13,587 |
|
13.12.2013, 19:21 |
19 |
Интересует: эту настройку можно сделать только убрав галку в этом окне, или где-то ещё, в свойсвах проекта, можно сделать?
0 |
545 / 378 / 56 Регистрация: 23.06.2013 Сообщений: 1,181 Записей в блоге: 6 |
|
13.12.2013, 19:24 |
20 |
А там нет, как в 10, создание пустого проекта (Общие — Пустой), без всяких окон мастера? Есть, но тут выдает ошибку… Миниатюры
3 |
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
“Security Enhanced Version of CRT Function”
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:
- Define the following macros in the precompiled header file stdafx.h (note: it must be before including any header files):
#define _CRT_SECURE_NO_DEPRECATE
- Or statement
#pragma warning(disable:4996)
- Change the preprocessing definition:
Project -> Properties -> Configuration Properties -> C/C++ -> Preprocessor -> Preprocessor Definition, add:
_CRT_SECURE_NO_DEPRECATE
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):
#define _CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES 1
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:
#define _CRT_SECURE_NO_DEPRECATE
#define _CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES 1
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.