Ошибка scanf в visual studio
Считывает отформатированные данные из стандартного входного потока. Доступны более безопасные версии этих функций; см. раздел scanf_s , _scanf_s_l wscanf_s ,, _wscanf_s_l .
в Visual Studio 2015 printf функция и scanf семейство функций были объявлены как inline и перемещены в заголовки и . При переносе старого кода вы можете увидеть ошибку LNK2019 в подключении к этим функциям. Дополнительные сведения см. в статье Visual C++ журнал изменений 2003-2015.
Синтаксис
Параметры
format
Строка управления форматированием.
argument
Необязательные аргументы.
locale
Используемый языковой стандарт.
Возвращаемое значение
Возвращает количество успешно преобразованных и назначенных полей. Возвращаемое значение не включает поля, которые были прочитаны, но не были назначены. Возвращаемое значение 0 указывает, что поля не были назначены.
Если format является указателем NULL , вызывается обработчик недопустимых параметров (см. раздел Проверка параметров). Если продолжение выполнения разрешено, эти функции возвращают EOF и устанавливают для errno значение EINVAL .
Дополнительные сведения об этих и других кодах ошибок см _doserrno . в статьях, errno _sys_errlist , и _sys_nerr .
Remarks
Функция scanf считывает данные из стандартного входного потока stdin и записывает данные в расположение, указанное параметром argument . Каждый параметр argument должен быть указателем на переменную, которая имеет тип, соответствующий спецификатору типа в параметре format . Если копирование производится между перекрывающимися строками, поведение не определено.
При чтении строки с параметром scanf всегда указывайте ширину %s формата (например, " %32s " вместо " %s "); в противном случае входные данные неправильного формата могут легко вызвать переполнение буфера. Кроме того, рекомендуется использовать scanf_s , _scanf_s_l , wscanf_s _wscanf_s_l или fgets .
wscanf — это версия scanf с расширенными символами; аргумент format для wscanf — строка расширенных символов. wscanf и scanf ведут себя одинаково, если поток открыт в режиме ANSI. scanf сейчас не поддерживает ввод из потока ЮНИКОДА.
Версии этих функций с суффиксом _l идентичны за исключением того, что они используют переданный параметр языкового стандарта вместо языкового стандарта текущего потока.
Универсальное текстовое сопоставление функций
TCHAR.H ассемблер | _UNICODE & _MBCS не определено | _MBCS определяется | _UNICODE определяется |
---|---|---|---|
_tscanf | scanf | scanf | wscanf |
_tscanf_l | _scanf_l | _scanf_l | _wscanf_l |
Требования
Подпрограмма | Обязательный заголовок |
---|---|
scanf , * *_scanf_l ** | |
wscanf , _wscanf_l | либо |
консоль не поддерживается в приложениях универсальная платформа Windows (UWP). Стандартные дескрипторы потока, связанные с консолью, stdin stdout , и stderr , должны быть перенаправлены до того, как функции времени выполнения C смогут использовать их в приложениях UWP. Дополнительные сведения о совместимости см. в статье Compatibility.
Компилятор в Visual Studio сильно отличается от привычных большинству программистов GCC или CLANG, из-за чего при написании кода на C или C++ очень часто возникают неожиданные проблемы в виде ошибки использования стандартных функций, например, scanf, fopen, sscanf и тому подобным. Студия предлагает заменять функции на безопасные (повезёт, если нужно просто добавить _s к функции с ошибкой, но нередко в этих функциях идёт иной набор аргументов, нежели в обычной программе). Если вы не готовы с этим мириться, то этот пост для вас!
Давайте для начала создадим обычный консольный проект в Visual Studio и напишем простенькую программу, которая запрашивает ввод двух чисел, вводит их и затем выводит на экран.
Попробовав выполнить сборку проекта, обнаружим те самые ошибки.
Чтобы Visual Studio не тратила ваши нервы, сделаем следующее:
1. Выберем пункт "Проект" в верхнем меню
2. В открывшемся списке щёлкнем по "Свойства название_проекта"
3. В появившемся окне выберем Свойства конфигурации , C/C++ , Препроцессор
4. В строке Определения препроцессора допишем в самый конец строку ;_CRT_SECURE_NO_WARNINGS
6. Попробуем заново выполнить сборку проекта:
Ошибки исчезли, сборка прошла успешно и программа прекрасно работает! Теперь можно писать код как обычно, не переживая о необычном поведении Visual Studio!
Выпускник МГУ им. М.В. Ломоносова
Programforyou — это сообщество, в котором Вы можете подтянуть свои знания по программированию, узнать, как эффективно решать те или иные задачи, а также воспользоваться нашими онлайн сервисами.
Функция Scanf () и функция scanf_s () в Visual Studio 2019
описание проблемы
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.
Анализ проблем и сравнение функций
функция scanf ()
Функция scanf () - это функция в ANSI C. Она не проверяет границу при чтении, поэтому может вызвать доступ к памяти вне допустимого диапазона. Например, выделяется 5 байтов пространства, но читается 10 байтов, как показано ниже:
Если вы введете 1234567890, 567890 будет записан в другое пространство, что приведет к аварийному запуску программы.
функция scanf_s ()
Чтобы предотвратить «scanf () не проверяет границу при чтении строки, что может вызвать утечку памяти» и привести к ненормальному запуску программы. Начиная с VS2005, Microsoft VS предоставляет функцию scanf_s (). Его функция такая же, как и у исходной функции scanf (), за исключением того, что когда вызывается функция scanf_s (),Необходимо указать число, чтобы указать максимальное количество символов для чтения во избежание переполнения.
Если в приведенном выше коде используется функция scanf_s (), вторая строка должна быть изменена на:
Это означает чтение не более 4 символов, потому что buf [4] должен помещать «\ 0». Последний параметр n функции scanf_s () - это размер буфера, что означает, что можно прочитать не более n-1 символов. При использовании функции scanf_s () для чтения одного символа также необходимо ограничить длину, которая записывается следующим образом.
подводить итоги
Функция scanf () - это исходная функция ввода, а функция scanf_s () - уникальная функция Microsoft VS. Оба имеют одинаковые функции, но последний более безопасен и надежен.
Повторное использование
При программировании на VS напишите в первой строке следующий оператор.
Если вы не хотите вводить оператор в первую строку, вы также можете настроить его в свойствах проекта VS, чтобы функция scanf могла нормально использоваться во всем проекте. Шаги настройки следующие:
- Найдите проект в строке меню → Свойства проекта → C / C ++ → препроцессор
- Справа есть определение препроцессора, добавьте к его параметрам _CRT_SECURE_NO_WARNINGS
3. Если два вышеупомянутых метода по-прежнему вызывают затруднения, существует третий метод. Найдите элемент в строке меню, найдите свойства проекта, найдите C / C ++, найдите генерацию кода, в генерации кода есть проверка безопасности, измените проверку безопасности, чтобы отключить проверку безопасности.
Последние две схемы применимы ко всему проекту, поскольку они изменяют параметры конфигурации проекта. Но этот параметр, естественно, не влияет на другие проекты, поэтому, если необходимо, ту же конфигурацию необходимо выполнить еще раз в других проектах, чтобы они вступили в силу.
Возвращаемое значение
1-3) Количество успешно назначенных принимающих аргументов (которое может быть нулевым в случае, если сбой сопоставления произошел до того, как был назначен первый получающий аргумент), или EOF, если сбой ввода произошел до того, как был назначен первый получающий аргумент.
Вы игнорируете это возвращаемое значение.
. чтобы узнать, было ли сканирование успешным. Не делать это плохая идея и стоит того предупреждения, которое вы получили.
Слишком много здесь, чтобы добавить комментарий.
Я использую версию Visual C, но она никогда не жалуется на то, что возвращаемое значение из scanf не используется. Что он делает, это жалуется, что scanf небезопасно и не рекомендуется, когда это не так.
MS думает, что я должен использовать свою собственную "более безопасную" версию scanf_s , которая даже сложнее в использовании, и IMO вовсе не безопаснее — потому что это не простая замена, а принимает другие аргументы, и поэтому легко делать ошибки в его использовании.
Функция scanf() не работает
Здравствуйте, помогите решить проблему с функцией scanf(); Она не принимает значения в переменные вообще. Работаю в Visual Studio 2017. Пробовал по советам очищать поток и присваивать переменным значение int, не помогает.
Ошибка в данном месте
Функция scanf не работает
Возникает проблема, что функция scanf не работает. Скрин: Можно как-нить решить? И не будут ли.
Не определяется функция scanf
Привет!) У меня такая проблема. не хочет считывать строки(( уже все перепробовал. вот.
Функция scanf(), не считывает данные
Вот перед вами кусок кода, это функция которая возвращает true или false bool ask(char *text)
Решение
Решение
Но при этом делаете вывод, что scanf не работает?
У всех работает, а у Вас не работает.
Очевидно же, что дело не в scanf.
Найдите ошибку в коде:
Функция ввода с клавиатуры scanf
Здравствуйте. WinXP, MS VS20005 В приведенном коде BBB независимо от введенного с клавиатуры.
Чтение вещественного числа, функция scanf
Здравствуйте! Только начал знакомство с этим замечательным языком. Возникла такая проблема.
Функция scanf + проверка на ввод данных
Как я понимаю: использовать scanf + массив для проверки на корректность ввода — неудачная идея. Она.
Почему не работает scanf в visual studio
MS VC2005, WinXP
В приведенном коде при вводе на первый запрос нечислового значения, например буквы, не выполняется последующий запрос scanf ввода значения BBB. В чем проблема?
Заранее благодарю за ответ!
unsigned short AAA, BBB;
int c;//промежут. переменная для ввода значений
void main()
setlocale(LC_CTYPE, "rus");
если не число ввести, то в c ничего не будет присвоено и останется предыдущее значение (скорее всего 0 в данном случае, ибо глобальная переменная).
(второе вроде не определено стандартом и может работать не везде)
MS VC2005, WinXP |
Он не портится, просто в нем остается та буква (если пытались прочитать число).
Почему Console.WriteLine не работает в коде Visual Studio?
У меня есть скрипты и кодернер, установленные в коде Visual Studio. Когда я запускаю простую программу, включающую Console.WriteLine("Test") , я ничего не вижу. Кажется, что программа успешно работает и завершает работу с кодом 0.
Вот весь код на случай, если кому-то будет интересно:
Если вы просто пытаетесь запустить файл CS без проекта и т. Д., Проблема заключается в том, что обработчик кода рассматривает файл как скрипт. Таким образом, основной метод на самом деле не вызывается так, как при запуске консольного приложения.
Поэтому решение состоит в том, чтобы сделать ваш метод main общедоступным и добавить вызов Program.Main (null); после определения класса. Это решение не требует никакого файла конфигурации launch.json или изменений конфигурации. Обратите внимание на вызов Program.Main после того, как определение класса действительно показывает ошибку в коде VS, но он прекрасно работает в коде запуска. Смотрите блок кода ниже.
Вы должны сделать это
Вам необходимо добавить любой из следующих строк кода
Код скомпилировался и затем запустился, но он не был очень быстрым, и консольное приложение закрылось после выполнения. Чтобы этого не случилось, вам нужно добавить еще один метод, например:
( Строка обозначает перевод строки, это означает, что курсор перемещается на следующую строку слева).
Таким образом, приложение закроется, если вы нажмете клавишу «Ввод» на клавиатуре.
Почему gets не работает в visual studio
Здравствуйте. У меня возникли проблемы с функцией gets().
Попробуй подключить данную библиотеку
попробуйте данный вариант
Так оно вообще не воспринимает русский. Хотя если переключить шрифт в консоли на Lucida Console все прекрасно работает. Но будет ли оно работать где либо, вне моего компьютера?
Хотя если изменить расположение файла, или поменять ему имя и т.д оно опять не работает, сбивается шрифт.
Функции gets и gets_s. В чем опасность
MSDN описывает функцию gets как устаревшую:
These functions are obsolete. Beginning in Visual Studio 2015, they are not available in the CRT. The secure versions of these functions, gets_s and _getws_s, are still available
Компилятор gcc также выдает предупреждение о том, что функция устаревшая:
warning: ‘char* gets(char*)’ is deprecated [-Wdeprecated-declarations]
В Linux man рассказано об опасностях использования этой функции:
Never use gets(). Because it is impossible to tell without knowing the
data in advance how many characters gets() will read, and because
gets() will continue to store characters past the end of the buffer, it
is extremely dangerous to use. It has been used to break computer
security. Use fgets() instead.
Таким образом, использование функции gets не рекомендуется нигде. Проблема функции в том, что она считывает данные в буфер до тех пор, пока не встретится символ конца строки, не учитывая размер буфера. Т.е., например, если мы выделим память под 25 символов, а пользователь введет строку из 40 символов, то следующие за строкой 15 байт будут перезаписаны. Такая ошибка может привести к чему угодно, причем программа может продолжать работать, но делать это неправильно (ошибку очень сложно выявить).
Описанные проблемы показаны следующим кодом:
Поля структуры располагаются в памяти последовательно, поэтому если пользователь введет название предмета более чем из семи символов (восьмым будет символ окончания строки), то стоимость предмета изменится:
Проблемы использования gets
char *fgets(char *s, int size, FILE *stream);
Заменив в приведенном выше коде ввод данных на
fgets(item.name, 8, stdin);
Мы получим другой вывод программы (теперь вводится только часть имени предмета, но не портятся данные и программа остается корректной.
Читайте также: