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 number\n");
printf("Fine Maximum of three number\n");
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);
}
Zloy_Tip 1 / 1 / 0 Регистрация: 01.09.2020 Сообщений: 2 |
||||
1 |
||||
01.09.2020, 17:10. Показов 8030. Ответов 23 Метки scanf (Все метки)
Здравствуйте, Уважаемые!
Компилятор пишет: не пойму, что там не так…?
1 |
Annemesski 2505 / 1228 / 454 Регистрация: 08.11.2016 Сообщений: 3,362 |
||||
01.09.2020, 17:16 |
2 |
|||
Сообщение было отмечено Zloy_Tip как решение РешениеZloy_Tip, закидоны VS-ки, не обращайте внимания или пропишите перед включением заголовков
3 |
6433 / 3965 / 1583 Регистрация: 09.05.2015 Сообщений: 9,272 |
|
01.09.2020, 17:49 |
3 |
Написано же что функция
0 |
3799 / 2349 / 413 Регистрация: 09.09.2017 Сообщений: 10,096 |
|
01.09.2020, 18:12 |
4 |
А scanf_s нестандартна, что еще хуже. Правильный способ уже указал Annemesski: приказать компилятору следовать стандарту.
1 |
6433 / 3965 / 1583 Регистрация: 09.05.2015 Сообщений: 9,272 |
|
01.09.2020, 18:29 |
5 |
А scanf_s нестандартна, что еще хуже. Бред не несите… https://en.cppreference.com/w/c/io/fscanf
Правильный способ уже указал Annemesski: приказать компилятору следовать стандарту. Не делайте так как сказал Annemesski, не подвергайте себя и других опасности!!!
0 |
96 / 69 / 27 Регистрация: 26.08.2020 Сообщений: 361 |
|
01.09.2020, 18:37 |
6 |
Я тебе советую использовать компилятор GCC.У Microsoft всегда сове видение,причем они не соответствуют стандарту языка!
0 |
из племени тумба-юбма 2435 / 1764 / 411 Регистрация: 29.11.2015 Сообщений: 8,571 Записей в блоге: 15 |
|
01.09.2020, 18:40 |
7 |
Someone007, а как тогда быть, если используется другая IDE, отличная от VS? На функции scanf_s будет выдавать ошибку.
0 |
6433 / 3965 / 1583 Регистрация: 09.05.2015 Сообщений: 9,272 |
|
01.09.2020, 18:46 |
8 |
а как тогда быть, если используется другая IDE, отличная от VS? На функции scanf_s будет выдавать ошибку. С чего вдруг? scanf_s это стандартная С функция…
0 |
3799 / 2349 / 413 Регистрация: 09.09.2017 Сообщений: 10,096 |
|
01.09.2020, 23:15 |
9 |
Не делайте так как сказал Annemesski, не подвергайте себя и других опасности!!! Именно! Не пользуйтесь платформо-зависимыми костылями от Майкрософт! Нестандартные функции вроде scanf_s кроме них не поддерживает никто.
С чего вдруг? scanf_s это стандартная С функция… Вот это вы успешно проглядели? As with all bounds-checked functions, scanf_s , fscanf_s, and sscanf_s are only guaranteed to be available if __STDC_LIB_EXT1__ is defined by the implementation and if the user defines __STDC_WANT_LIB_EXT1__ to the integer constant 1 before including stdio.h. Иначе говоря, функции *_s опциональны, а вовсе не стандартны.
0 |
6433 / 3965 / 1583 Регистрация: 09.05.2015 Сообщений: 9,272 |
|
02.09.2020, 00:16 |
10 |
Иначе говоря, функции *_s опциональны, а вовсе не стандартны. То что они опциональны, не отменяет того факта что они часть стандарта.
0 |
Вездепух 11087 / 6054 / 1651 Регистрация: 18.10.2014 Сообщений: 15,183 |
|
02.09.2020, 00:30 |
11 |
То что они опциональны, не отменяет того факта что они часть стандарта. Он просто вбрасывает эту чушь во все темы, где упоминаются эти функции. Лучше просто не обращать на это внимания. Функции группы Добавлено через 2 минуты
У Microsoft всегда сове видение,причем они не соответствуют стандарту языка! Не надо здесь пороть «пионэрскую» чушь.
0 |
Модератор 12222 / 7354 / 1730 Регистрация: 25.07.2009 Сообщений: 13,461 |
|
02.09.2020, 04:56 |
12 |
TheCalligrapher, просто для расширения кругозора назовите хоть один компилятор не от Майкрософт, поддерживающий эти «стандартные» функции.
Бред не несите
Не надо здесь пороть «пионэрскую» чушь И вообще, будьте оба немного сдержаннее. То, что не все разделяют вашу странную привязанность к M$ — не повод для хамства.
0 |
Вездепух 11087 / 6054 / 1651 Регистрация: 18.10.2014 Сообщений: 15,183 |
|
02.09.2020, 05:22 |
13 |
просто для расширения кругозора назовите хоть один компилятор не от Майкрософт, поддерживающий эти «стандартные» функции А, какое это имеет значение? Если бы подобные соображения имели вес, то комитет по стандартизации никогда бы не включил эти функции в стандарт языка. (Скажете, что это следствие «странной привязанности к M$С» самого комитета?). С другой стороны, несмотря на то, что, например, функция К тому же предыдущий оратор пытается навязать нам некую более широкую «логику», согласно которой опциональные свойства языка или стандартной библиотеки являются «нестандартными» (???). В эту категорию, кстати, попадают и VLA, типы вроде Я последнее время игнорирую эти вбросы, но время от времени их следует пресекать, особенно когда делаются попытки насаждения подобных домыслов среди начинающих. Если бы речь шла о портабельности кода, то замечания о функциях группы
0 |
3799 / 2349 / 413 Регистрация: 09.09.2017 Сообщений: 10,096 |
|
02.09.2020, 07:45 |
14 |
Если бы подобные соображения имели вес, то комитет по стандартизации никогда бы не включил эти функции в стандарт языка. Если бы подобные соображения имели место, эти функции были бы реализованы хоть кем-то кроме самих Майкрософтов. В реальности же никто не считает это нужным.
В эту категорию, кстати, попадают и VLA, типы вроде uint32_t, uintptr_t, errno_t и многое другое Про VLA сказать не могу. Просто не интересовался, но слышал, что ее использование чаще мешает, поэтому и смысла пропагандировать нет.
Я последнее время игнорирую эти вбросы, но время от времени их следует пресекать, особенно когда делаются попытки насаждения подобных домыслов среди начинающих. Пресекать надо бездумный формализм из серии «так сказано в стандарте, это ИстинаЪ, молитесь ей». Программирование- ремесло, а не религия. Поэтому каждое утверждение должно быть обосновано.
1 |
из племени тумба-юбма 2435 / 1764 / 411 Регистрация: 29.11.2015 Сообщений: 8,571 Записей в блоге: 15 |
|
02.09.2020, 11:18 |
15 |
Ну тут пожалуй, я соглашусь с COKPOWEHEU. Если Майкрософт добились, чтоб их новые, «безопасные» функции для их же продукта были занесены в стандарт, еще не означает того, что данные функции можно называть стандартными. Проще сказать так, что для компилятора от Майкрософт, функции группы _s являются стандартными, для остальных компиляторов — нет. Но опять же говоря о безопасности, ведь знающий человек просто напишет код грамотно, тогда и никакого переполнения буфера не будет. Вообще Майкрософт в силу своего влияния и убеждения могут довольно много, причем делают это они не считаясь не скем. Это касается и добровольно-принудительного переселения всех пользователей на Windows10, и производства новых процессоров, поддерживающих только новую OS. Компания не брезгует использовать любые доступные методы, порой даже весьма жесткие, лишь бы задавить своих конкурентов и продвигать свои продукты. Не подумайте что я негативно отношусь к их продуктам, нет. Я негативно отношусь к их политике поведения на рынке.
1 |
easybudda Модератор 12222 / 7354 / 1730 Регистрация: 25.07.2009 Сообщений: 13,461 |
||||
02.09.2020, 13:55 |
16 |
|||
А, какое это имеет значение? «Причём тут борщ, когда такие дела на кухне?!» (с)
функция strdup присутствует практически везде, стандартной она не является Ну она в POSIX входит. К тому же её нужность и полезность, как и многих других пришедших из BSD вещей, становится очевидной по мере использования.
Скажете, что это следствие «странной привязанности к M$С» самого комитета? Ну может мелкомягкие им просто денег занесли на «дальнейшее развитие»…
VLA, типы вроде uint32_t, uintptr_t, errno_t … входят в ANSI C 99, нормальную поддержку которого M$ сделать так и не удосужились. А в С 11 стали опцией скорее всего по той же причине, по которой были включены *_s функции.
Пресекать надо бездумный формализм из серии «так сказано в стандарте, это ИстинаЪ, молитесь ей». Программирование- ремесло, а не религия.
Про VLA сказать не могу. Просто не интересовался, но слышал, что ее использование чаще мешает, поэтому и смысла пропагандировать нет. Я бы сказал, что использование VLA в чём-то сходно с использованием рекурсивных функций — если бездумно их пихать везде, где надо и не надо, обязательно нарвётесь на неприятности. А при разумном подходе может оказаться вполне удобным инструментом… Zloy_Tip, короче, прийдётся выбирать между
закидоны VS-ки, не обращайте внимания или пропишите перед включением заголовков
и
Написано же что функция scanf небезопасна, используйте вместо нее scanf_s, что тут непонятного? По мне правильнее первое — как минимум, код будет переносимым и не привязанным к единственному компилятору. Если готовитесь стать адептом культа M$, смело выбирайте второе…
0 |
Вездепух 11087 / 6054 / 1651 Регистрация: 18.10.2014 Сообщений: 15,183 |
|
02.09.2020, 14:04 |
17 |
… входят в ANSI C 99, …. являются опциональными в С99 (кроме VLA), т.е, согласно «логике» вышеупомянутого оратора, нестандартными.
нормальную поддержку которого M$ сделать так и не удосужились. …нормальную поддержку которого MS реализовали уже давно.
0 |
3799 / 2349 / 413 Регистрация: 09.09.2017 Сообщений: 10,096 |
|
02.09.2020, 17:51 |
18 |
VLA, типы вроде uint32_t, uintptr_t, errno_t Скорее, потому что строго 16-битного типа может быть не предусмотрено архитектурой. Или, скажем, строго 8-битного. Вроде бывают такие экзотические камни, хотя я их не видел.
…нормальную поддержку которого MS реализовали уже давно. Но это не мешает им пихать свои DWORD и прочие рудименты во все щели.
0 |
Модератор 1820 / 917 / 166 Регистрация: 23.07.2018 Сообщений: 3,120 Записей в блоге: 3 |
|
02.09.2020, 18:33 |
19 |
Zloy_Tip, насколько я понимаю microsoft, это предупреждение компилятора, а не ошибка В учебных упражнениях проще всего не обращать внимание на это сообщение.
Microsoft deprecated some CRT and C++ Standard Library functions and globals because more secure versions are available. Most of the deprecated functions allow unchecked read or write access to buffers. Their misuse can lead to serious security issues. The compiler issues a deprecation warning for these functions, and suggests the preferred function. To fix this issue, we recommend you use the function or variable safe-version instead. Sometimes you can’t, for portability or backwards compatibility reasons. Carefully verify it’s not possible for a buffer overwrite or overread to occur in your code. Then, you can turn off the warning. To turn off deprecation warnings for these functions in the CRT, define _CRT_SECURE_NO_WARNINGS. Добавлено через 13 минут
пресекать навязывание псевдо-безопасных функций вроде scanf_s тоже нужно. Потому что поддерживаются они одним-единственным компилятором (подумайте об этом: профессиональные разработчики даже не пытаются их реализовать) Каких ещё профессиональных разработчиков Вы знаете, кроме Microsoft ?
0 |
Вездепух 11087 / 6054 / 1651 Регистрация: 18.10.2014 Сообщений: 15,183 |
|
02.09.2020, 18:35 |
20 |
Zloy_Tip, насколько я понимаю microsoft, это предупреждение компилятора, а не ошибка Тема уже 100500 раз разбиралась здесь. Если в установках проекта включены «SDL checks», то это — именно ошибка, а не предупреждение компилятора. А «SDL checks» в нынешних версиях MSVC включены по умолчанию. Поэтому большинство новичков натыкаются именно на Ошибка C4996, как и процитировано у ТС.
0 |
IT_Exp Эксперт 87844 / 49110 / 22898 Регистрация: 17.06.2006 Сообщений: 92,604 |
02.09.2020, 18:35 |
Помогаю со студенческими работами здесь Линкер ругается на функцию #include… Ругается на функцию в функции Компилятор ругается на функцию strncat long p,x,i,j,k,d,l; В main объявить переменную, потом в другой функции ее инициализировать, вызывая функцию scanf Антивирус ругается на функцию отправки почты Почему компилятор ругается на математическую функцию? using namespace… Искать еще темы с ответами Или воспользуйтесь поиском по форуму: 20 |
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 number\n");
printf("Fine Maximum of three number\n");
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);
}
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.
Similar Posts:
Время чтения: 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: %d\n", 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
Выпускник МГУ им. М.В. Ломоносова