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.
код программы:

#define _CRT_SECURE_NO_WARNINGS
#include "stdafx.h"
#include "stdio.h"

int main()
{
    int a;
    scanf("%d", &a);
    return 0;
}

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

Harry's user avatar

Harry

215k15 золотых знаков117 серебряных знаков228 бронзовых знаков

задан 9 дек 2017 в 20:09

Вячеслав161's user avatar

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

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

Используя

#define _CRT_SECURE_NO_WARNINGS

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

ответ дан 9 дек 2017 в 20:16

Harry's user avatar

HarryHarry

215k15 золотых знаков117 серебряных знаков228 бронзовых знаков

7

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

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

ответ дан 9 дек 2017 в 20:31

AnT stands with Russia's user avatar

Zloy_Tip

1 / 1 / 0

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

Сообщений: 2

1

01.09.2020, 17:10. Показов 7152. Ответов 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



3576 / 2244 / 406

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

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

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



3576 / 2244 / 406

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

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

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Эксперт С++

10908 / 5905 / 1613

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

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

02.09.2020, 00:30

11

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

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

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

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

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

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

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

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



0



Модератор

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

11891 / 7264 / 1720

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

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

02.09.2020, 04:56

12

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

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

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

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

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

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



0



Вездепух

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

10908 / 5905 / 1613

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

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

02.09.2020, 05:22

13

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

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

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

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

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



0



3576 / 2244 / 406

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

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

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Эксперт С++

11891 / 7264 / 1720

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

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

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Эксперт С++

10908 / 5905 / 1613

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

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

02.09.2020, 14:04

17

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

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

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

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

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

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



0



3576 / 2244 / 406

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

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

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,055

Записей в блоге: 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Эксперт С++

10908 / 5905 / 1613

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

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

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

2 Августа 2017

Время чтения: 5 минут

Visual Studio unsafe error скриншот

Компилятор в 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

Нажимаем OK

6. Попробуем заново выполнить сборку проекта:

Успешная сборка проекта

Успешная сборка проекта

Ошибки исчезли, сборка прошла успешно и программа прекрасно работает! Теперь можно писать код как обычно, не переживая о необычном поведении Visual Studio!

Фото Перминова Андрея, автора этой статьи

Программист, сооснователь programforyou.ru, в постоянном поиске новых задач и алгоритмов

Языки программирования: Python, C, C++, Pascal, C#, Javascript

Выпускник МГУ им. М.В. Ломоносова

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

Ошибка 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
#include "stdafx.h"
#include "stdio.h"

int main()
{
    int a;
    scanf("%d", &a);
    return 0;
}

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

Harry's user avatar

Harry

210k15 золотых знаков114 серебряных знаков224 бронзовых знака

задан 9 дек 2017 в 20:09

Вячеслав161's user avatar

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

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

Используя

#define _CRT_SECURE_NO_WARNINGS

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

ответ дан 9 дек 2017 в 20:16

Harry's user avatar

HarryHarry

210k15 золотых знаков114 серебряных знаков224 бронзовых знака

7

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

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

ответ дан 9 дек 2017 в 20:31

AnT stands with Russia's user avatar

0 / 0 / 0

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

Сообщений: 18

1

09.05.2011, 18:28. Показов 97686. Ответов 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.
1>

подскажите как исправить =(

__________________
Помощь в написании контрольных, курсовых и дипломных работ, диссертаций здесь

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

использовать

C++
1
scanf_s

и это не ошибка, а предупреждение.

2

600 / 568 / 104

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

Сообщений: 2,004

09.05.2011, 22:06

3

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

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.
1>

подскажите как исправить =(

это майкрософт типа говорит использовать, но это не относится к стандарту, не юзайте

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

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

это майкрософт типа говорит использовать, но это не относится к стандарту, не юзайте

таак, а если у меня из-за этой ошибки не компилируется? чо делать?

а, тьфу, дошло, спасибо

0

831 / 639 / 100

Регистрация: 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

5493 / 4888 / 831

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

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

20.09.2013, 20:39

7

Не знаю, как в 12, но в 10, в свойствах проекта — С++ — Общие, есть пункт: Обрабатывать предупреждения как ошибки.

1

831 / 639 / 100

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

Сообщений: 2,524

20.09.2013, 22:18

8

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

Не знаю, как в 12, но в 10, в свойствах проекта — С++ — Общие, есть пункт: Обрабатывать предупреждения как ошибки.

В ПН проверю. А как он оказался включенным в только что созданном проекте? Это где-то в настройках студии?

0

5493 / 4888 / 831

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

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

20.09.2013, 22:32

9

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

А как он оказался включенным в только что созданном проекте? Это где-то в настройках студии?

….

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

Не знаю, как в 12

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

в 10, в свойствах проекта — С++ — Общие, есть пункт: Обрабатывать предупреждения как ошибки.

0

831 / 639 / 100

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

Сообщений: 2,524

20.09.2013, 22:41

10

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

в 10, в свойствах проекта — С++ — Общие, есть пункт: Обрабатывать предупреждения как ошибки.

Я спросил, как настраивается его состояние при создании нового проекта.

0

5493 / 4888 / 831

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

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

20.09.2013, 22:50

11

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

Я спросил, как настраивается его состояние при создании нового проекта.

Всё что знаю — написал.

0

831 / 639 / 100

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

Сообщений: 2,524

13.12.2013, 17:32

12

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

Я спросил, как настраивается его состояние при создании нового проекта.

Сам разобрался — см. скриншот.

PS: Перечислю тех, кого это может интересовать, чтобы они получили уведомления: alsav22, Oceloto, max_besheniy, Sveta073, ranebull.

Миниатюры

Ошибка в SCANF
 

6

5493 / 4888 / 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

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

Это при создании проекта консоль Win32? А если пустой создавать?

Да, это ситуация при создании проекта консоль Win32. При создании пустого проекта выдаются лишь предупреждения.

0

5493 / 4888 / 831

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

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

13.12.2013, 18:42

15

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

При создании пустого проекта выдаются лишь предупреждения.

Это точно? 12 или 13 студия? Проверено?

0

545 / 378 / 56

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

Сообщений: 1,181

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

13.12.2013, 18:47

16

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

Это точно? 12 или 13 студия? Проверено?

Скриншоты

Миниатюры

Ошибка в SCANF
 

Ошибка в SCANF
 

1

5493 / 4888 / 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

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

Сам разобрался — см. скриншот.

PS: Перечислю тех, кого это может интересовать, чтобы они получили уведомления: alsav22, Oceloto, max_besheniy, Sveta073, ranebull.

Почему я получил уведомление?

0

5493 / 4888 / 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

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

А там нет, как в 10, создание пустого проекта (Общие — Пустой), без всяких окон мастера?

Есть, но тут выдает ошибку…
В самом проекте проверка SDL отключается следующим образом: Проект->Свойства: %имя проекта%->C/C++ ->Проверки SDL->Нет(/sdl-)

Миниатюры

Ошибка в SCANF
 

Ошибка в SCANF
 

3

2 Августа 2017

Время чтения: 5 минут

Visual Studio unsafe error скриншот

Компилятор в 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

Нажимаем OK

6. Попробуем заново выполнить сборку проекта:

Успешная сборка проекта

Успешная сборка проекта

Ошибки исчезли, сборка прошла успешно и программа прекрасно работает! Теперь можно писать код как обычно, не переживая о необычном поведении Visual Studio!

Фото Перминова Андрея, автора этой статьи

Программист, сооснователь programforyou.ru, в постоянном поиске новых задач и алгоритмов

Языки программирования: Python, C, C++, Pascal, C#, Javascript

Выпускник МГУ им. М.В. Ломоносова

For scanf, you need to check its return value to see if the conversion on the input worked. scanf will return the number of elements successfully scanned. If the conversion did not work, it will leave the input alone, and you can try to scan it differently, or just report an error. For example:

if (scanf("%d", &i) != 1) {
    char buf[512];
    fgets(buf, sizeof(buf), stdin);
    printf("error in line %d: got %s", j, buf);
    return 0;
}

In your program, since the input is left alone, your loop repeats trying to read the same input.

In C++, you check for failure using the fail method, but the input stream failure state is sticky. So it won’t let you scan further without clearing the error state.

    std::cin >> i;
    if (std::cin.fail()) {
        std::string buf;
        std::cin.clear();
        std::getline(cin, buf);
        std::cout
             << "error in line " << j
             << ": got " << buf
             << std::endl;
        return 0;
    }

In your program, since you never clear the failure state, the loop repeats using cin in a failure state, so it just reports failure without doing anything.

In both cases, you might find it easier or more reliable to work with the input if you would read in the input line first, and then attempt to parse the input line. In pseudocode:

while read_a_line succeeds
    parse_a_line

In C, the catch to reading a line is that if it is longer than your buffer, you will need to check for that and concatenate multiple fgets call results together to form the line. And, to parse a line, you can use sscanf, which is similar to scanf but works on strings.

    if (sscanf(buf, "%d", &i) != 1) {
        printf("error in line %d: got %s", j, buf);
        return 0;
    }

In C++, for quick low level parsing of formatted input, I also prefer sscanf. But, if you want to use the stream approach, you can convert the string buffer into a istringstream to scan the input.

    std::getline(cin, buf);
    if (std::cin.fail()) {
        break;
    }
    std::istringstream buf_in(buf);
    buf_in >> i;
    if (buf_in.fail()) {
        std::cout << "error in line " << j
             << ": got " << buf
             << std::endl;
        return 0;
    }

For scanf, you need to check its return value to see if the conversion on the input worked. scanf will return the number of elements successfully scanned. If the conversion did not work, it will leave the input alone, and you can try to scan it differently, or just report an error. For example:

if (scanf("%d", &i) != 1) {
    char buf[512];
    fgets(buf, sizeof(buf), stdin);
    printf("error in line %d: got %s", j, buf);
    return 0;
}

In your program, since the input is left alone, your loop repeats trying to read the same input.

In C++, you check for failure using the fail method, but the input stream failure state is sticky. So it won’t let you scan further without clearing the error state.

    std::cin >> i;
    if (std::cin.fail()) {
        std::string buf;
        std::cin.clear();
        std::getline(cin, buf);
        std::cout
             << "error in line " << j
             << ": got " << buf
             << std::endl;
        return 0;
    }

In your program, since you never clear the failure state, the loop repeats using cin in a failure state, so it just reports failure without doing anything.

In both cases, you might find it easier or more reliable to work with the input if you would read in the input line first, and then attempt to parse the input line. In pseudocode:

while read_a_line succeeds
    parse_a_line

In C, the catch to reading a line is that if it is longer than your buffer, you will need to check for that and concatenate multiple fgets call results together to form the line. And, to parse a line, you can use sscanf, which is similar to scanf but works on strings.

    if (sscanf(buf, "%d", &i) != 1) {
        printf("error in line %d: got %s", j, buf);
        return 0;
    }

In C++, for quick low level parsing of formatted input, I also prefer sscanf. But, if you want to use the stream approach, you can convert the string buffer into a istringstream to scan the input.

    std::getline(cin, buf);
    if (std::cin.fail()) {
        break;
    }
    std::istringstream buf_in(buf);
    buf_in >> i;
    if (buf_in.fail()) {
        std::cout << "error in line " << j
             << ": got " << buf
             << std::endl;
        return 0;
    }

Понравилась статья? Поделить с друзьями:
  • Scan twain ошибка
  • Scan ksp ошибка
  • Scad ошибка при разложении матрицы 99
  • Sc899 00 ricoh ошибка
  • Sc819 00 ricoh ошибка