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);
}
Zloy_Tip 1 / 1 / 0 Регистрация: 01.09.2020 Сообщений: 2 |
||||
1 |
||||
01.09.2020, 17:10. Показов 7167. Ответов 23 Метки scanf (Все метки)
Здравствуйте, Уважаемые!
Компилятор пишет: не пойму, что там не так…?
1 |
Annemesski 2439 / 1178 / 436 Регистрация: 08.11.2016 Сообщений: 3,262 |
||||
01.09.2020, 17:16 |
2 |
|||
Сообщение было отмечено Zloy_Tip как решение РешениеZloy_Tip, закидоны VS-ки, не обращайте внимания или пропишите перед включением заголовков
3 |
6316 / 3935 / 1577 Регистрация: 09.05.2015 Сообщений: 9,237 |
|
01.09.2020, 17:49 |
3 |
Написано же что функция
0 |
3579 / 2247 / 407 Регистрация: 09.09.2017 Сообщений: 9,400 |
|
01.09.2020, 18:12 |
4 |
А scanf_s нестандартна, что еще хуже. Правильный способ уже указал Annemesski: приказать компилятору следовать стандарту.
1 |
6316 / 3935 / 1577 Регистрация: 09.05.2015 Сообщений: 9,237 |
|
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 |
из племени тумба-юбма 2412 / 1741 / 405 Регистрация: 29.11.2015 Сообщений: 8,442 Записей в блоге: 14 |
|
01.09.2020, 18:40 |
7 |
Someone007, а как тогда быть, если используется другая IDE, отличная от VS? На функции scanf_s будет выдавать ошибку.
0 |
6316 / 3935 / 1577 Регистрация: 09.05.2015 Сообщений: 9,237 |
|
01.09.2020, 18:46 |
8 |
а как тогда быть, если используется другая IDE, отличная от VS? На функции scanf_s будет выдавать ошибку. С чего вдруг? scanf_s это стандартная С функция…
0 |
3579 / 2247 / 407 Регистрация: 09.09.2017 Сообщений: 9,400 |
|
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 |
6316 / 3935 / 1577 Регистрация: 09.05.2015 Сообщений: 9,237 |
|
02.09.2020, 00:16 |
10 |
Иначе говоря, функции *_s опциональны, а вовсе не стандартны. То что они опциональны, не отменяет того факта что они часть стандарта.
0 |
Вездепух 10913 / 5909 / 1614 Регистрация: 18.10.2014 Сообщений: 14,850 |
|
02.09.2020, 00:30 |
11 |
То что они опциональны, не отменяет того факта что они часть стандарта. Он просто вбрасывает эту чушь во все темы, где упоминаются эти функции. Лучше просто не обращать на это внимания. Функции группы Добавлено через 2 минуты
У Microsoft всегда сове видение,причем они не соответствуют стандарту языка! Не надо здесь пороть «пионэрскую» чушь.
0 |
Модератор 11892 / 7265 / 1720 Регистрация: 25.07.2009 Сообщений: 13,295 |
|
02.09.2020, 04:56 |
12 |
TheCalligrapher, просто для расширения кругозора назовите хоть один компилятор не от Майкрософт, поддерживающий эти «стандартные» функции.
Бред не несите
Не надо здесь пороть «пионэрскую» чушь И вообще, будьте оба немного сдержаннее. То, что не все разделяют вашу странную привязанность к M$ — не повод для хамства.
0 |
Вездепух 10913 / 5909 / 1614 Регистрация: 18.10.2014 Сообщений: 14,850 |
|
02.09.2020, 05:22 |
13 |
просто для расширения кругозора назовите хоть один компилятор не от Майкрософт, поддерживающий эти «стандартные» функции А, какое это имеет значение? Если бы подобные соображения имели вес, то комитет по стандартизации никогда бы не включил эти функции в стандарт языка. (Скажете, что это следствие «странной привязанности к M$С» самого комитета?). С другой стороны, несмотря на то, что, например, функция К тому же предыдущий оратор пытается навязать нам некую более широкую «логику», согласно которой опциональные свойства языка или стандартной библиотеки являются «нестандартными» (???). В эту категорию, кстати, попадают и VLA, типы вроде Я последнее время игнорирую эти вбросы, но время от времени их следует пресекать, особенно когда делаются попытки насаждения подобных домыслов среди начинающих. Если бы речь шла о портабельности кода, то замечания о функциях группы
0 |
3579 / 2247 / 407 Регистрация: 09.09.2017 Сообщений: 9,400 |
|
02.09.2020, 07:45 |
14 |
Если бы подобные соображения имели вес, то комитет по стандартизации никогда бы не включил эти функции в стандарт языка. Если бы подобные соображения имели место, эти функции были бы реализованы хоть кем-то кроме самих Майкрософтов. В реальности же никто не считает это нужным.
В эту категорию, кстати, попадают и VLA, типы вроде uint32_t, uintptr_t, errno_t и многое другое Про VLA сказать не могу. Просто не интересовался, но слышал, что ее использование чаще мешает, поэтому и смысла пропагандировать нет.
Я последнее время игнорирую эти вбросы, но время от времени их следует пресекать, особенно когда делаются попытки насаждения подобных домыслов среди начинающих. Пресекать надо бездумный формализм из серии «так сказано в стандарте, это ИстинаЪ, молитесь ей». Программирование- ремесло, а не религия. Поэтому каждое утверждение должно быть обосновано.
1 |
из племени тумба-юбма 2412 / 1741 / 405 Регистрация: 29.11.2015 Сообщений: 8,442 Записей в блоге: 14 |
|
02.09.2020, 11:18 |
15 |
Ну тут пожалуй, я соглашусь с COKPOWEHEU. Если Майкрософт добились, чтоб их новые, «безопасные» функции для их же продукта были занесены в стандарт, еще не означает того, что данные функции можно называть стандартными. Проще сказать так, что для компилятора от Майкрософт, функции группы _s являются стандартными, для остальных компиляторов — нет. Но опять же говоря о безопасности, ведь знающий человек просто напишет код грамотно, тогда и никакого переполнения буфера не будет. Вообще Майкрософт в силу своего влияния и убеждения могут довольно много, причем делают это они не считаясь не скем. Это касается и добровольно-принудительного переселения всех пользователей на Windows10, и производства новых процессоров, поддерживающих только новую OS. Компания не брезгует использовать любые доступные методы, порой даже весьма жесткие, лишь бы задавить своих конкурентов и продвигать свои продукты. Не подумайте что я негативно отношусь к их продуктам, нет. Я негативно отношусь к их политике поведения на рынке.
1 |
easybudda Модератор 11892 / 7265 / 1720 Регистрация: 25.07.2009 Сообщений: 13,295 |
||||
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 |
Вездепух 10913 / 5909 / 1614 Регистрация: 18.10.2014 Сообщений: 14,850 |
|
02.09.2020, 14:04 |
17 |
… входят в ANSI C 99, …. являются опциональными в С99 (кроме VLA), т.е, согласно «логике» вышеупомянутого оратора, нестандартными.
нормальную поддержку которого M$ сделать так и не удосужились. …нормальную поддержку которого MS реализовали уже давно.
0 |
3579 / 2247 / 407 Регистрация: 09.09.2017 Сообщений: 9,400 |
|
02.09.2020, 17:51 |
18 |
VLA, типы вроде uint32_t, uintptr_t, errno_t Скорее, потому что строго 16-битного типа может быть не предусмотрено архитектурой. Или, скажем, строго 8-битного. Вроде бывают такие экзотические камни, хотя я их не видел.
…нормальную поддержку которого MS реализовали уже давно. Но это не мешает им пихать свои DWORD и прочие рудименты во все щели.
0 |
Модератор 1783 / 881 / 164 Регистрация: 23.07.2018 Сообщений: 3,060 Записей в блоге: 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 |
Вездепух 10913 / 5909 / 1614 Регистрация: 18.10.2014 Сообщений: 14,850 |
|
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 |
При использовании 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, программа запускается но после ввода значения выкидывает такую ошибку:
The error «C4996: ‘scanf’: This function or variable may be unsafe in c programming» is a warning message generated by the Microsoft Visual C++ compiler, indicating that the use of the ‘scanf’ function may result in security vulnerabilities. This warning message is part of the compiler’s security features, which aim to prevent potential security breaches by flagging potentially unsafe functions.
Method 1: Use fgets() and sscanf() instead of scanf()
To fix error C4996: ‘scanf’: This function or variable may be unsafe in c programming, you can use fgets() and sscanf() instead of scanf(). Here’s how to do it in a few simple steps:
- Use fgets() to read input from the user. This function reads a line of text from the input stream and stores it in a buffer.
char input[100];
fgets(input, sizeof(input), stdin);
- Use sscanf() to parse the input. This function reads formatted input from a string and stores the values in variables.
int num;
sscanf(input, "%d", &num);
- Use the variables to perform any necessary calculations or operations.
int result = num * 2;
printf("The result is: %dn", result);
Here’s the complete code example:
#include <stdio.h>
int main() {
char input[100];
int num;
printf("Enter a number: ");
fgets(input, sizeof(input), stdin);
sscanf(input, "%d", &num);
int result = num * 2;
printf("The result is: %dn", result);
return 0;
}
This code reads a number from the user, doubles it, and prints the result. By using fgets() and sscanf() instead of scanf(), we avoid the potential security issues associated with scanf().
Method 2: Use the «_CRT_SECURE_NO_WARNINGS» preprocessor directive
To fix the error C4996: ‘scanf’: This function or variable may be unsafe in c programming, you can use the «_CRT_SECURE_NO_WARNINGS» preprocessor directive. This directive tells the compiler to ignore the warning and allows you to use the unsafe functions like scanf. Here are the steps to use this directive:
-
Open your Visual Studio project.
-
Right-click on the project in the Solution Explorer and select Properties.
-
In the Properties window, click on the C/C++ tab and select Preprocessor from the left-hand menu.
-
In the Preprocessor Definitions field, add «_CRT_SECURE_NO_WARNINGS» (without quotes) and click OK.
Here is an example code that uses scanf with the «_CRT_SECURE_NO_WARNINGS» directive:
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
int main() {
int num;
printf("Enter a number: ");
scanf("%d", &num);
printf("You entered: %d", num);
return 0;
}
In this example, we define the «_CRT_SECURE_NO_WARNINGS» directive before including the stdio.h header file. This tells the compiler to ignore the warning for the scanf function.
Another example code that uses scanf with the «_CRT_SECURE_NO_WARNINGS» directive and checks for errors:
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
int main() {
int num;
printf("Enter a number: ");
if (scanf("%d", &num) != 1) {
printf("Error: Invalid input.");
return 1;
}
printf("You entered: %d", num);
return 0;
}
In this example, we use the scanf function to read an integer from the user. We check if the return value of scanf is 1, which indicates that one integer was successfully read. If the return value is not 1, we print an error message and exit the program.
Using the «_CRT_SECURE_NO_WARNINGS» directive allows you to use the scanf function without warnings, but you should always validate user input to prevent errors and vulnerabilities in your code.
Method 3: Use the secure version of scanf(), such as scanf_s()
To fix the error C4996: ‘scanf’: This function or variable may be unsafe in C programming, you can use the secure version of scanf(), such as scanf_s(). Here’s how to do it:
- Include the header file «stdio.h» and «stdlib.h» in your program.
#include <stdio.h>
#include <stdlib.h>
- Replace scanf with scanf_s and add the size of the input buffer as the second parameter.
char str[50];
scanf_s("%s", str, 50);
- If you want to read in a specific number of characters, you can use the format specifier «%Ns», where N is the maximum number of characters to read.
char str[50];
scanf_s("%49s", str, 50);
- If you want to read in a string with spaces, you can use the format specifier «%[^n]s».
char str[50];
scanf_s("%49[^n]s", str, 50);
- If you want to read in an integer, you can use the format specifier «%d».
int num;
scanf_s("%d", &num);
- If you want to read in a float, you can use the format specifier «%f».
float num;
scanf_s("%f", &num);
- If you want to read in a double, you can use the format specifier «%lf».
double num;
scanf_s("%lf", &num);
That’s it! By using scanf_s() instead of scanf, you can fix the error C4996: ‘scanf’: This function or variable may be unsafe in C programming.
- Remove From My Forums
-
Question
-
I have an error from scanf.
error C4996: ‘scanf’: This function or variable may be unsafe. Consider using scanf_s instead.
int a = 0, b = 0; char op = 0; int result = 0; scanf("%d %c %d", &a, &op, &b);
Error disappeared after change it to scanf_s.
What is the difference between scanf and scanf_s?
All replies
-
-
Proposed as answer by
Thursday, February 13, 2020 6:43 AM
-
Proposed as answer by
-
Hi,
Thank you for posting here.
>>What is the difference between scanf and scanf_s?
scanf: Reads formatted data from the standard input stream.
scanf_s: Reads formatted data from the standard input stream.But safer than scanf ().scanf originally just reads whatever console input you type and assign it to a type of variable.
scanf_s has an parameter, When you read a string, the parameter must be provided to indicate how many characters are read at most to prevent overflow.I suggest you could refer to the link: https://docs.microsoft.com/en-us/cpp/c-runtime-library/security-features-in-the-crt?view=vs-2019
Best Regards,
Jeanine Zhang
-
Proposed as answer by
Guido Franzke
Thursday, February 13, 2020 6:43 AM
-
Proposed as answer by
-
Hi,
Have you got any updates? If your case has been solved, please help to mark answers. If not, just feel free to contact us.
Your understanding and cooperation will be grateful.
Best Regards,
Jeanine Zhang