Ошибка 4996 scanf

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 (Все метки)


Студворк — интернет-сервис помощи студентам

Здравствуйте, Уважаемые!
Начал изучать язык Си и буквально в начале книги уже наткнулся на неприятность.
При запуске программы, компилятор ругается на функцию scanf. проверил не один раз, с точки зрения синтаксиса написано все верно.
Мой код:

C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
#include <stdio.h>
 
main() {
    int a, number;
 
    printf("Enter number int: ");
        scanf("%d", &a);
 
    if (number != 7) {
        printf("The variable number is not equal to 7");
    }
 
    printf("This is a C program n");
    printf("This is a C n program nn");
    printf("This nis na nC n program nn");
 
    return 0;
}

Компилятор пишет:
Ошибка 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. Project2 C:UsersProfessionalDesktopProjectsProject2Project2Main.c 8

не пойму, что там не так…?
ниже на код не обращайте внимание, делаю не большие задачки все подряд просто в одном файле, смотрю как работает.



1



Annemesski

2439 / 1178 / 436

Регистрация: 08.11.2016

Сообщений: 3,262

01.09.2020, 17:16

2

Лучший ответ Сообщение было отмечено Zloy_Tip как решение

Решение

Zloy_Tip, закидоны VS-ки, не обращайте внимания или пропишите перед включением заголовков

C
1
#define _CRT_SECURE_NO_WARNINGS



3



Эксперт .NET

6316 / 3935 / 1577

Регистрация: 09.05.2015

Сообщений: 9,237

01.09.2020, 17:49

3

Написано же что функция scanf небезопасна, используйте вместо нее scanf_s, что тут непонятного?



0



3579 / 2247 / 407

Регистрация: 09.09.2017

Сообщений: 9,400

01.09.2020, 18:12

4

А scanf_s нестандартна, что еще хуже. Правильный способ уже указал Annemesski: приказать компилятору следовать стандарту.



1



Эксперт .NET

6316 / 3935 / 1577

Регистрация: 09.05.2015

Сообщений: 9,237

01.09.2020, 18:29

5

Цитата
Сообщение от COKPOWEHEU
Посмотреть сообщение

А scanf_s нестандартна, что еще хуже.

Бред не несите… https://en.cppreference.com/w/c/io/fscanf

Цитата
Сообщение от COKPOWEHEU
Посмотреть сообщение

Правильный способ уже указал 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



Эксперт .NET

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

Цитата
Сообщение от Someone007
Посмотреть сообщение

Не делайте так как сказал Annemesski, не подвергайте себя и других опасности!!!

Именно! Не пользуйтесь платформо-зависимыми костылями от Майкрософт! Нестандартные функции вроде scanf_s кроме них не поддерживает никто.
Если вам нужна безопасность, изучайте документацию на стандартные функции. В подавляющем большинстве случаев их достаточно.

Цитата
Сообщение от Someone007
Посмотреть сообщение

С чего вдруг? 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



Эксперт .NET

6316 / 3935 / 1577

Регистрация: 09.05.2015

Сообщений: 9,237

02.09.2020, 00:16

10

Цитата
Сообщение от COKPOWEHEU
Посмотреть сообщение

Иначе говоря, функции *_s опциональны, а вовсе не стандартны.

То что они опциональны, не отменяет того факта что они часть стандарта.



0



Вездепух

Эксперт CЭксперт С++

10913 / 5909 / 1614

Регистрация: 18.10.2014

Сообщений: 14,850

02.09.2020, 00:30

11

Цитата
Сообщение от Someone007
Посмотреть сообщение

То что они опциональны, не отменяет того факта что они часть стандарта.

Он просто вбрасывает эту чушь во все темы, где упоминаются эти функции. Лучше просто не обращать на это внимания.

Функции группы _s стандартны. Этот вопрос закрыт и не обсуждается. Не тратьте время на бессмысленный флуд.

Добавлено через 2 минуты

Цитата
Сообщение от scanf
Посмотреть сообщение

У Microsoft всегда сове видение,причем они не соответствуют стандарту языка!

Не надо здесь пороть «пионэрскую» чушь.



0



Модератор

Эксперт PythonЭксперт JavaЭксперт CЭксперт С++

11892 / 7265 / 1720

Регистрация: 25.07.2009

Сообщений: 13,295

02.09.2020, 04:56

12

TheCalligrapher, просто для расширения кругозора назовите хоть один компилятор не от Майкрософт, поддерживающий эти «стандартные» функции.

Цитата
Сообщение от Someone007
Посмотреть сообщение

Бред не несите

Цитата
Сообщение от TheCalligrapher
Посмотреть сообщение

Не надо здесь пороть «пионэрскую» чушь

И вообще, будьте оба немного сдержаннее. То, что не все разделяют вашу странную привязанность к M$ — не повод для хамства.



0



Вездепух

Эксперт CЭксперт С++

10913 / 5909 / 1614

Регистрация: 18.10.2014

Сообщений: 14,850

02.09.2020, 05:22

13

Цитата
Сообщение от easybudda
Посмотреть сообщение

просто для расширения кругозора назовите хоть один компилятор не от Майкрософт, поддерживающий эти «стандартные» функции

А, какое это имеет значение? Если бы подобные соображения имели вес, то комитет по стандартизации никогда бы не включил эти функции в стандарт языка. (Скажете, что это следствие «странной привязанности к M$С» самого комитета?). С другой стороны, несмотря на то, что, например, функция strdup присутствует практически везде, стандартной она не является. Так что «поддержка компиляторами» и «стандартность» — это совершенно ортогональные понятия.

К тому же предыдущий оратор пытается навязать нам некую более широкую «логику», согласно которой опциональные свойства языка или стандартной библиотеки являются «нестандартными» (???). В эту категорию, кстати, попадают и VLA, типы вроде uint32_t, uintptr_t, errno_t и многое другое. И эта загадочная ложная «логика» упорно насаждается вышеупомянутым оратором в каждой ветке, где упоминаются функции группы _s.

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



0



3579 / 2247 / 407

Регистрация: 09.09.2017

Сообщений: 9,400

02.09.2020, 07:45

14

Цитата
Сообщение от TheCalligrapher
Посмотреть сообщение

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

Если бы подобные соображения имели место, эти функции были бы реализованы хоть кем-то кроме самих Майкрософтов. В реальности же никто не считает это нужным.

Цитата
Сообщение от TheCalligrapher
Посмотреть сообщение

В эту категорию, кстати, попадают и VLA, типы вроде uint32_t, uintptr_t, errno_t и многое другое

Про VLA сказать не могу. Просто не интересовался, но слышал, что ее использование чаще мешает, поэтому и смысла пропагандировать нет.
А вот int*_t объективно предпочтительнее еще более нестандартных BYTE, DWORD, u8 и т.д. Ну и если назовете компилятор, который этого не поддерживает — будет полезно. В отличие от того бреда что уже наговорили.

Цитата
Сообщение от TheCalligrapher
Посмотреть сообщение

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

Пресекать надо бездумный формализм из серии «так сказано в стандарте, это ИстинаЪ, молитесь ей». Программирование- ремесло, а не религия. Поэтому каждое утверждение должно быть обосновано.
Так и тут: навязывать стандартизованные (если уж вашему формализму не по нраву «стандартные») типы вроде int16_t полезно. Потому что типы фиксированного размера нужны, а данный вариант, в отличие от других существующих, подкреплен стандартом Си и поддерживается большинством компиляторов. Иначе говоря не столь важно стандарт это или нет, на сегодня этот вариант лучше прочих.
И пресекать навязывание псевдо-безопасных функций вроде scanf_s тоже нужно. Потому что поддерживаются они одним-единственным компилятором (подумайте об этом: профессиональные разработчики даже не пытаются их реализовать). Кроме того, эти функции добавляют иллюзию безопасности, что, вообще-то, опаснее стандартного аналога, изначально постулируемой как требующего внимания. Реальные проблемы, к которым это приведет (помимо снижения безопасности, естественно): переход между архитектурами (в т.ч. на микроеонтроллеры и телефоны), проблемы с поиском помощи (желающий помочь банально не сможет воспроизвести ошибку).



1



из племени тумба-юбма

2412 / 1741 / 405

Регистрация: 29.11.2015

Сообщений: 8,442

Записей в блоге: 14

02.09.2020, 11:18

15

Ну тут пожалуй, я соглашусь с COKPOWEHEU. Если Майкрософт добились, чтоб их новые, «безопасные» функции для их же продукта были занесены в стандарт, еще не означает того, что данные функции можно называть стандартными. Проще сказать так, что для компилятора от Майкрософт, функции группы _s являются стандартными, для остальных компиляторов — нет. Но опять же говоря о безопасности, ведь знающий человек просто напишет код грамотно, тогда и никакого переполнения буфера не будет.

Вообще Майкрософт в силу своего влияния и убеждения могут довольно много, причем делают это они не считаясь не скем. Это касается и добровольно-принудительного переселения всех пользователей на Windows10, и производства новых процессоров, поддерживающих только новую OS. Компания не брезгует использовать любые доступные методы, порой даже весьма жесткие, лишь бы задавить своих конкурентов и продвигать свои продукты.

Не подумайте что я негативно отношусь к их продуктам, нет. Я негативно отношусь к их политике поведения на рынке.



1



easybudda

Модератор

Эксперт PythonЭксперт JavaЭксперт CЭксперт С++

11892 / 7265 / 1720

Регистрация: 25.07.2009

Сообщений: 13,295

02.09.2020, 13:55

16

Цитата
Сообщение от TheCalligrapher
Посмотреть сообщение

А, какое это имеет значение?

«Причём тут борщ, когда такие дела на кухне?!» (с)

Цитата
Сообщение от TheCalligrapher
Посмотреть сообщение

функция strdup присутствует практически везде, стандартной она не является

Ну она в POSIX входит. К тому же её нужность и полезность, как и многих других пришедших из BSD вещей, становится очевидной по мере использования.

Цитата
Сообщение от TheCalligrapher
Посмотреть сообщение

Скажете, что это следствие «странной привязанности к M$С» самого комитета?

Ну может мелкомягкие им просто денег занесли на «дальнейшее развитие»…

Цитата
Сообщение от TheCalligrapher
Посмотреть сообщение

VLA, типы вроде uint32_t, uintptr_t, errno_t

… входят в ANSI C 99, нормальную поддержку которого M$ сделать так и не удосужились. А в С 11 стали опцией скорее всего по той же причине, по которой были включены *_s функции.

Цитата
Сообщение от COKPOWEHEU
Посмотреть сообщение

Пресекать надо бездумный формализм из серии «так сказано в стандарте, это ИстинаЪ, молитесь ей». Программирование- ремесло, а не религия.

Цитата
Сообщение от COKPOWEHEU
Посмотреть сообщение

Про VLA сказать не могу. Просто не интересовался, но слышал, что ее использование чаще мешает, поэтому и смысла пропагандировать нет.

Я бы сказал, что использование VLA в чём-то сходно с использованием рекурсивных функций — если бездумно их пихать везде, где надо и не надо, обязательно нарвётесь на неприятности. А при разумном подходе может оказаться вполне удобным инструментом…

Zloy_Tip, короче, прийдётся выбирать между

Цитата
Сообщение от Annemesski
Посмотреть сообщение

закидоны VS-ки, не обращайте внимания или пропишите перед включением заголовков

C
1
#define _CRT_SECURE_NO_WARNINGS

и

Цитата
Сообщение от Someone007
Посмотреть сообщение

Написано же что функция scanf небезопасна, используйте вместо нее scanf_s, что тут непонятного?

По мне правильнее первое — как минимум, код будет переносимым и не привязанным к единственному компилятору. Если готовитесь стать адептом культа M$, смело выбирайте второе…



0



Вездепух

Эксперт CЭксперт С++

10913 / 5909 / 1614

Регистрация: 18.10.2014

Сообщений: 14,850

02.09.2020, 14:04

17

Цитата
Сообщение от easybudda
Посмотреть сообщение

… входят в ANSI C 99,

…. являются опциональными в С99 (кроме VLA), т.е, согласно «логике» вышеупомянутого оратора, нестандартными.

Цитата
Сообщение от easybudda
Посмотреть сообщение

нормальную поддержку которого M$ сделать так и не удосужились.

…нормальную поддержку которого MS реализовали уже давно.



0



3579 / 2247 / 407

Регистрация: 09.09.2017

Сообщений: 9,400

02.09.2020, 17:51

18

Цитата
Сообщение от easybudda
Посмотреть сообщение

VLA, типы вроде uint32_t, uintptr_t, errno_t
… входят в ANSI C 99, нормальную поддержку которого M$ сделать так и не удосужились. А в С 11 стали опцией скорее всего по той же причине, по которой были включены *_s функции.

Скорее, потому что строго 16-битного типа может быть не предусмотрено архитектурой. Или, скажем, строго 8-битного. Вроде бывают такие экзотические камни, хотя я их не видел.
При том что int_fast32_t и int_least32_t если не ошибаюсь, таки обязательны даже для них.

Цитата
Сообщение от TheCalligrapher
Посмотреть сообщение

…нормальную поддержку которого MS реализовали уже давно.

Но это не мешает им пихать свои DWORD и прочие рудименты во все щели.



0



Модератор

1783 / 881 / 164

Регистрация: 23.07.2018

Сообщений: 3,060

Записей в блоге: 3

02.09.2020, 18:33

19

Zloy_Tip, насколько я понимаю microsoft, это предупреждение компилятора, а не ошибка
https://docs.microsoft.com/en-… el-3-c4996

В учебных упражнениях проще всего не обращать внимание на это сообщение.
Или следовать совету поставщика компилятора:

Цитата
Сообщение от 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 минут

Цитата
Сообщение от COKPOWEHEU
Посмотреть сообщение

пресекать навязывание псевдо-безопасных функций вроде scanf_s тоже нужно. Потому что поддерживаются они одним-единственным компилятором (подумайте об этом: профессиональные разработчики даже не пытаются их реализовать)

Каких ещё профессиональных разработчиков Вы знаете, кроме Microsoft ?
https://docs.oracle.com/cd/E88… -s-3c.html



0



Вездепух

Эксперт CЭксперт С++

10913 / 5909 / 1614

Регистрация: 18.10.2014

Сообщений: 14,850

02.09.2020, 18:35

20

Цитата
Сообщение от politoto
Посмотреть сообщение

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

Помогаю со студенческими работами здесь

Линкер ругается на функцию
// laba7evteev.cpp: определяет можно ли из слов первой строки составить вторую
//

#include…

Ругается на функцию в функции
#include &lt;stdio.h&gt;
#include &lt;stdlib.h&gt;
#include &lt;time.h&gt;
#include &lt;math.h&gt;
#define A 10…

Компилятор ругается на функцию strncat
#include &lt;iostream&gt;
#include &lt;string&gt;
using namespace std;

long p,x,i,j,k,d,l;
char t,s;…

В main объявить переменную, потом в другой функции ее инициализировать, вызывая функцию scanf
Помогите разобраться с задачей. Нужно в main объявить переменную, потом в другой функции ее…

Антивирус ругается на функцию отправки почты
Антивирус — Kaspersky Internet Security 2012.
ОС — Windows 7 x64.
IDE -…

Почему компилятор ругается на математическую функцию?
#include &quot;stdafx.h&quot;
#include &lt;iostream&gt;
#include &lt;string&gt;
#include &lt;cmath&gt;

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, программа запускается но после ввода значения выкидывает такую ошибку:
dadd1062d568496b8a2b5a511177299f.png

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:

  1. 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);
  1. 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);
  1. 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:

  1. Open your Visual Studio project.

  2. Right-click on the project in the Solution Explorer and select Properties.

  3. In the Properties window, click on the C/C++ tab and select Preprocessor from the left-hand menu.

  4. 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:

  1. Include the header file «stdio.h» and «stdlib.h» in your program.
#include <stdio.h>
#include <stdlib.h>
  1. 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);
  1. 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);
  1. 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);
  1. If you want to read in an integer, you can use the format specifier «%d».
int num;
scanf_s("%d", &num);
  1. If you want to read in a float, you can use the format specifier «%f».
float num;
scanf_s("%f", &num);
  1. 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.

RRS feed

  • 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

  • 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

  • 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

Понравилась статья? Поделить с друзьями:
  • Ошибка 4981 abb
  • Ошибка 49682 vag
  • Ошибка 49508 vag
  • Ошибка 4949 bmw n57
  • Ошибка 49441 шкода