Здравствуйте. При попытке компиляции проекта возникает следующая ошибка:
Ошибка 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
215k15 золотых знаков117 серебряных знаков228 бронзовых знаков
задан 9 дек 2017 в 20:09
Просто функция считается небезопасной, позволяющей в принципе привести к переполнению буфера (и сопутствующим неприятностям, вплоть до взлома программы хакерами :))
Поэтому вас предупреждают об использовании потенциально небезопасной функции.
Используя
#define _CRT_SECURE_NO_WARNINGS
вы говорите — да, я знаю и принимаю на себя всю ответственность.
ответ дан 9 дек 2017 в 20:16
HarryHarry
215k15 золотых знаков117 серебряных знаков228 бронзовых знаков
7
Это диагностическое сообщение является «ошибкой» только если у вас в установках проекта включены SDL Checks
. Если выключить SDL Checks
, то «ошибка» превратится в «предупреждение».
Чтобы избавиться от него полностью, определите макро _CRT_SECURE_NO_WARNINGS
перед включением стандартных заголовочных файлов. Лучше всего сделать это глобально, в настройках проекта.
ответ дан 9 дек 2017 в 20:31
Zloy_Tip 1 / 1 / 0 Регистрация: 01.09.2020 Сообщений: 2 |
||||
1 |
||||
01.09.2020, 17:10. Показов 7152. Ответов 23 Метки scanf (Все метки)
Здравствуйте, Уважаемые!
Компилятор пишет: не пойму, что там не так…?
1 |
Annemesski 2439 / 1178 / 436 Регистрация: 08.11.2016 Сообщений: 3,262 |
||||
01.09.2020, 17:16 |
2 |
|||
РешениеZloy_Tip, закидоны VS-ки, не обращайте внимания или пропишите перед включением заголовков
3 |
6316 / 3935 / 1577 Регистрация: 09.05.2015 Сообщений: 9,237 |
|
01.09.2020, 17:49 |
3 |
Написано же что функция
0 |
3576 / 2244 / 406 Регистрация: 09.09.2017 Сообщений: 9,397 |
|
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 |
3576 / 2244 / 406 Регистрация: 09.09.2017 Сообщений: 9,397 |
|
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 |
Вездепух 10908 / 5905 / 1613 Регистрация: 18.10.2014 Сообщений: 14,841 |
|
02.09.2020, 00:30 |
11 |
То что они опциональны, не отменяет того факта что они часть стандарта. Он просто вбрасывает эту чушь во все темы, где упоминаются эти функции. Лучше просто не обращать на это внимания. Функции группы Добавлено через 2 минуты
У Microsoft всегда сове видение,причем они не соответствуют стандарту языка! Не надо здесь пороть «пионэрскую» чушь.
0 |
Модератор 11891 / 7264 / 1720 Регистрация: 25.07.2009 Сообщений: 13,293 |
|
02.09.2020, 04:56 |
12 |
TheCalligrapher, просто для расширения кругозора назовите хоть один компилятор не от Майкрософт, поддерживающий эти «стандартные» функции.
Бред не несите
Не надо здесь пороть «пионэрскую» чушь И вообще, будьте оба немного сдержаннее. То, что не все разделяют вашу странную привязанность к M$ — не повод для хамства.
0 |
Вездепух 10908 / 5905 / 1613 Регистрация: 18.10.2014 Сообщений: 14,841 |
|
02.09.2020, 05:22 |
13 |
просто для расширения кругозора назовите хоть один компилятор не от Майкрософт, поддерживающий эти «стандартные» функции А, какое это имеет значение? Если бы подобные соображения имели вес, то комитет по стандартизации никогда бы не включил эти функции в стандарт языка. (Скажете, что это следствие «странной привязанности к M$С» самого комитета?). С другой стороны, несмотря на то, что, например, функция К тому же предыдущий оратор пытается навязать нам некую более широкую «логику», согласно которой опциональные свойства языка или стандартной библиотеки являются «нестандартными» (???). В эту категорию, кстати, попадают и VLA, типы вроде Я последнее время игнорирую эти вбросы, но время от времени их следует пресекать, особенно когда делаются попытки насаждения подобных домыслов среди начинающих. Если бы речь шла о портабельности кода, то замечания о функциях группы
0 |
3576 / 2244 / 406 Регистрация: 09.09.2017 Сообщений: 9,397 |
|
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 Модератор 11891 / 7264 / 1720 Регистрация: 25.07.2009 Сообщений: 13,293 |
||||
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 |
Вездепух 10908 / 5905 / 1613 Регистрация: 18.10.2014 Сообщений: 14,841 |
|
02.09.2020, 14:04 |
17 |
… входят в ANSI C 99, …. являются опциональными в С99 (кроме VLA), т.е, согласно «логике» вышеупомянутого оратора, нестандартными.
нормальную поддержку которого M$ сделать так и не удосужились. …нормальную поддержку которого MS реализовали уже давно.
0 |
3576 / 2244 / 406 Регистрация: 09.09.2017 Сообщений: 9,397 |
|
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,055 Записей в блоге: 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 |
Вездепух 10908 / 5905 / 1613 Регистрация: 18.10.2014 Сообщений: 14,841 |
|
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, программа запускается но после ввода значения выкидывает такую ошибку:
2 Августа 2017
Время чтения: 5 минут
Компилятор в Visual Studio сильно отличается от привычных большинству программистов GCC или CLANG, из-за чего при написании кода на C или C++ очень часто возникают неожиданные проблемы в виде ошибки использования стандартных функций, например, scanf, fopen, sscanf и тому подобным. Студия предлагает заменять функции на безопасные (повезёт, если нужно просто добавить _s к функции с ошибкой, но нередко в этих функциях идёт иной набор аргументов, нежели в обычной программе). Если вы не готовы с этим мириться, то этот пост для вас!
Давайте для начала создадим обычный консольный проект в Visual Studio и напишем простенькую программу, которая запрашивает ввод двух чисел, вводит их и затем выводит на экран.
#include "stdafx.h" #include <stdio.h> int main() { int a, b; printf("Enter a: "); scanf("%d", &a); printf("Enter b: "); scanf("%d", &b); printf("a: %d, b: %dn", a, b); return 0; }
Попробовав выполнить сборку проекта, обнаружим те самые ошибки.
Чтобы Visual Studio не тратила ваши нервы, сделаем следующее:
1. Выберем пункт «Проект» в верхнем меню
2. В открывшемся списке щёлкнем по «Свойства название_проекта»
Программа, вводящая два числа и выводящая их
Ошибка компиляции из-за небезопасности функций
Проект — Свойства {навание проекта}
3. В появившемся окне выберем Свойства конфигурации
, C/C++
, Препроцессор
4. В строке Определения препроцессора
допишем в самый конец строку ;_CRT_SECURE_NO_WARNINGS
5. Нажмём ОК
Свойства конфигурации
Определения препроцессора
Нажимаем OK
6. Попробуем заново выполнить сборку проекта:
Успешная сборка проекта
Ошибки исчезли, сборка прошла успешно и программа прекрасно работает! Теперь можно писать код как обычно, не переживая о необычном поведении Visual Studio!
Программист, сооснователь programforyou.ru, в постоянном поиске новых задач и алгоритмов
Языки программирования: Python, C, C++, Pascal, C#, Javascript
Выпускник МГУ им. М.В. Ломоносова
Здравствуйте. При попытке компиляции проекта возникает следующая ошибка:
Ошибка 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
210k15 золотых знаков114 серебряных знаков224 бронзовых знака
задан 9 дек 2017 в 20:09
Просто функция считается небезопасной, позволяющей в принципе привести к переполнению буфера (и сопутствующим неприятностям, вплоть до взлома программы хакерами :))
Поэтому вас предупреждают об использовании потенциально небезопасной функции.
Используя
#define _CRT_SECURE_NO_WARNINGS
вы говорите — да, я знаю и принимаю на себя всю ответственность.
ответ дан 9 дек 2017 в 20:16
HarryHarry
210k15 золотых знаков114 серебряных знаков224 бронзовых знака
7
Это диагностическое сообщение является «ошибкой» только если у вас в установках проекта включены SDL Checks
. Если выключить SDL Checks
, то «ошибка» превратится в «предупреждение».
Чтобы избавиться от него полностью, определите макро _CRT_SECURE_NO_WARNINGS
перед включением стандартных заголовочных файлов. Лучше всего сделать это глобально, в настройках проекта.
ответ дан 9 дек 2017 в 20:31
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. подскажите как исправить =(
__________________ 0 |
Programming Эксперт 94731 / 64177 / 26122 Регистрация: 12.04.2006 Сообщений: 116,782 |
09.05.2011, 18:28 |
21 |
resource2008 111 / 112 / 18 Регистрация: 11.03.2011 Сообщений: 421 |
||||
09.05.2011, 21:33 |
2 |
|||
использовать
и это не ошибка, а предупреждение. 2 |
600 / 568 / 104 Регистрация: 07.11.2010 Сообщений: 2,004 |
|
09.05.2011, 22:06 |
3 |
warning C4996: ‘scanf’: This function or variable may be unsafe. Consider using scanf_s instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details. подскажите как исправить =( это майкрософт типа говорит использовать, но это не относится к стандарту, не юзайте 0 |
0 / 0 / 0 Регистрация: 28.04.2011 Сообщений: 18 |
|
10.05.2011, 00:30 [ТС] |
4 |
спасибо) 0 |
0 / 0 / 0 Регистрация: 13.09.2012 Сообщений: 13 |
|
12.10.2012, 07:45 |
5 |
это майкрософт типа говорит использовать, но это не относится к стандарту, не юзайте таак, а если у меня из-за этой ошибки не компилируется? чо делать? а, тьфу, дошло, спасибо 0 |
831 / 639 / 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 |
Не знаю, как в 12, но в 10, в свойствах проекта — С++ — Общие, есть пункт: Обрабатывать предупреждения как ошибки. В ПН проверю. А как он оказался включенным в только что созданном проекте? Это где-то в настройках студии? 0 |
5493 / 4888 / 831 Регистрация: 04.06.2011 Сообщений: 13,587 |
|
20.09.2013, 22:32 |
9 |
А как он оказался включенным в только что созданном проекте? Это где-то в настройках студии? ….
Не знаю, как в 12
в 10, в свойствах проекта — С++ — Общие, есть пункт: Обрабатывать предупреждения как ошибки. 0 |
831 / 639 / 100 Регистрация: 20.08.2013 Сообщений: 2,524 |
|
20.09.2013, 22:41 |
10 |
в 10, в свойствах проекта — С++ — Общие, есть пункт: Обрабатывать предупреждения как ошибки. Я спросил, как настраивается его состояние при создании нового проекта. 0 |
5493 / 4888 / 831 Регистрация: 04.06.2011 Сообщений: 13,587 |
|
20.09.2013, 22:50 |
11 |
Я спросил, как настраивается его состояние при создании нового проекта. Всё что знаю — написал. 0 |
831 / 639 / 100 Регистрация: 20.08.2013 Сообщений: 2,524 |
|
13.12.2013, 17:32 |
12 |
Я спросил, как настраивается его состояние при создании нового проекта. Сам разобрался — см. скриншот. PS: Перечислю тех, кого это может интересовать, чтобы они получили уведомления: alsav22, Oceloto, max_besheniy, Sveta073, ranebull. Миниатюры
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 |
Это при создании проекта консоль Win32? А если пустой создавать? Да, это ситуация при создании проекта консоль Win32. При создании пустого проекта выдаются лишь предупреждения. 0 |
5493 / 4888 / 831 Регистрация: 04.06.2011 Сообщений: 13,587 |
|
13.12.2013, 18:42 |
15 |
При создании пустого проекта выдаются лишь предупреждения. Это точно? 12 или 13 студия? Проверено? 0 |
545 / 378 / 56 Регистрация: 23.06.2013 Сообщений: 1,181 Записей в блоге: 6 |
|
13.12.2013, 18:47 |
16 |
Это точно? 12 или 13 студия? Проверено? Скриншоты Миниатюры
1 |
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 |
Сам разобрался — см. скриншот. 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 |
А там нет, как в 10, создание пустого проекта (Общие — Пустой), без всяких окон мастера? Есть, но тут выдает ошибку… Миниатюры
3 |
2 Августа 2017
Время чтения: 5 минут
Компилятор в Visual Studio сильно отличается от привычных большинству программистов GCC или CLANG, из-за чего при написании кода на C или C++ очень часто возникают неожиданные проблемы в виде ошибки использования стандартных функций, например, scanf, fopen, sscanf и тому подобным. Студия предлагает заменять функции на безопасные (повезёт, если нужно просто добавить _s к функции с ошибкой, но нередко в этих функциях идёт иной набор аргументов, нежели в обычной программе). Если вы не готовы с этим мириться, то этот пост для вас!
Давайте для начала создадим обычный консольный проект в Visual Studio и напишем простенькую программу, которая запрашивает ввод двух чисел, вводит их и затем выводит на экран.
#include "stdafx.h" #include <stdio.h> int main() { int a, b; printf("Enter a: "); scanf("%d", &a); printf("Enter b: "); scanf("%d", &b); printf("a: %d, b: %dn", a, b); return 0; }
Попробовав выполнить сборку проекта, обнаружим те самые ошибки.
Чтобы Visual Studio не тратила ваши нервы, сделаем следующее:
1. Выберем пункт «Проект» в верхнем меню
2. В открывшемся списке щёлкнем по «Свойства название_проекта»
Программа, вводящая два числа и выводящая их
Ошибка компиляции из-за небезопасности функций
Проект — Свойства {навание проекта}
3. В появившемся окне выберем Свойства конфигурации
, C/C++
, Препроцессор
4. В строке Определения препроцессора
допишем в самый конец строку ;_CRT_SECURE_NO_WARNINGS
5. Нажмём ОК
Свойства конфигурации
Определения препроцессора
Нажимаем OK
6. Попробуем заново выполнить сборку проекта:
Успешная сборка проекта
Ошибки исчезли, сборка прошла успешно и программа прекрасно работает! Теперь можно писать код как обычно, не переживая о необычном поведении Visual Studio!
Программист, сооснователь programforyou.ru, в постоянном поиске новых задач и алгоритмов
Языки программирования: Python, C, C++, Pascal, C#, Javascript
Выпускник МГУ им. М.В. Ломоносова
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;
}