Как использовать scanf в visual studio

Обновлено: 08.07.2024

Функция 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 ++, найдите генерацию кода, в генерации кода есть проверка безопасности, измените проверку безопасности, чтобы отключить проверку безопасности.

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

Интеллектуальная рекомендация


Michael.W Поговорите о Hyperledger Fabric. Проблема 20 - Подробная индивидуальная сортировка узла с пятью порядками с исходным кодом для чтения.

Michael.W Поговорите о Hyperledger Fabric. Проблема 20 - Подробная индивидуальная сортировка узла с пятью порядками с исходным кодом чтения Fabric Файл исходного кода одиночного режима находится в ord.


Мяу Пасс Матрица SDUT

Мяу Пасс Матрица SDUT Time Limit: 1000 ms Memory Limit: 65536 KiB Submit Statistic Problem Description Лянцзян получил матрицу, но эта матрица была особенно уродливой, и Лянцзян испытал отвращение. Чт.


Гессенская легкая двоичная структура удаленного вызова

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


TCP Pasket и распаковка и Нетти Solutions

Основные введение TCP является ориентированным на соединение, обеспечивая высокую надежность услуг. На обоих концах (клиенты и терминалы сервера) должны иметь один или более гнезда, так что передающий.

Считывает отформатированные данные из стандартного входного потока. Эти версии scanf , _scanf_l wscanf , _wscanf_l , имеют улучшения безопасности, как описано в разделе функции безопасности в CRT.

Синтаксис

Параметры

format
Строка управления форматированием.

argument
Необязательные аргументы.

locale
Используемый языковой стандарт.

Возвращаемое значение

Возвращает число успешно преобразованных и назначенных полей. Возвращаемое значение не включает поля, которые были считаны, но не были назначены. Возвращаемое значение 0 указывает, что поля не были назначены. Возвращаемое значение — EOF для ошибки или, если символ конца файла или символ конца строки находится в первой попытке чтения символа. Если параметр Format является NULL указателем, вызывается обработчик недопустимых параметров, как описано в разделе Проверка параметров. Значение, если выполнение может быть продолжено, scanf_s и wscanf_s Возврат конца файла и установка значения errno EINVAL .

Дополнительные сведения об этих и других кодах ошибок см. в статьях errno ,, _doserrno _sys_errlist и _sys_nerr .

Remarks

scanf_s Функция считывает данные из стандартного входного потока stdin и записывает их в argument . Каждый argument должен быть указателем на тип переменной, который соответствует спецификатору типа в format . Если копирование производится между перекрывающимися строками, поведение не определено.

wscanf_s — Это версия с расширенными символами scanf_s ; аргумент Format для wscanf_s — строка расширенных символов. wscanf_s и scanf_s ведут себя одинаково, если поток открыт в режиме ANSI. scanf_s в настоящее время не поддерживает входные данные из потока Юникода.

Версии этих функций с суффиксом _l идентичны, за исключением того, что они используют locale параметр вместо языкового стандарта текущего потока.

В отличие от scanf и wscanf , scanf_s и wscanf_s требует указать размеры буферов для некоторых параметров. Укажите размеры для всех c C s S параметров набора строк управления. или [] . Размер буфера в символах передается как дополнительный параметр. Он сразу следует за указателем на буфер или переменную. Например, при чтении строки размер буфера для этой строки передается следующим образом:

Размер буфера включает значение терминала null. Поле спецификации ширины можно использовать, чтобы убедиться, что считываемый маркер соответствует буферу. Если размер токена слишком велик, в буфер не записывается, если не задана спецификация ширины.

Параметр size имеет тип unsigned , а не size_t . Используйте статическое приведение для преобразования size_t значения в unsigned 64-разрядные конфигурации сборки.

Параметр размера буфера описывает максимальное число символов, а не байтов. В этом примере ширина типа буфера не соответствует ширине описателя формата.

S Описатель формата означает использование ширины символа, которая является "противоположной" шириной по умолчанию, поддерживаемой функцией. Ширина символа равна одному байту, но функция поддерживает двухбайтовые символы. Этот пример считывает строку длиной до девяти двухбайтовых символов и помещает их в буфер двухбайтовых символов. Символы обрабатываются как однобайтовые значения; первые два символа сохраняются в ws[0] , вторые два сохраняются в ws[1] и т. д.

В этом примере считывается один символ:

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

Дополнительные сведения см. в разделе scanf Спецификация ширины.

Универсальное текстовое сопоставление функций

TCHAR.H ассемблер _UNICODE & _MBCS не определено _MBCS определяется _UNICODE определяется
_tscanf_s scanf_s scanf_s wscanf_s
_tscanf_s_l _scanf_s_l _scanf_s_l _wscanf_s_l

Требования

Подпрограмма Обязательный заголовок
scanf_s , _scanf_s_l <stdio.h>
wscanf_s , _wscanf_s_l <stdio.h> либо <wchar.h>

консоль не поддерживается в приложениях универсальная платформа Windows (UWP). Стандартный поток обрабатывает stdin , stdout и stderr должен быть перенаправлен, прежде чем функции времени выполнения C смогут использовать их в приложениях UWP. Дополнительные сведения о совместимости см. в статье Compatibility.

Reads formatted data from the standard input stream. More secure versions of these function are available; see scanf_s , _scanf_s_l , wscanf_s , _wscanf_s_l .

In Visual Studio 2015 The printf and scanf family of functions were declared as inline and moved to the <stdio.h> and <conio.h> headers. If you are migrating older code you might see LNK2019 in connection with these functions. For more information, see Visual C++ change history 2003 - 2015.

Syntax

Parameters

format
Format control string.

argument
Optional arguments.

locale
The locale to use.

Return Value

Returns the number of fields successfully converted and assigned; the return value does not include fields that were read but not assigned. A return value of 0 indicates that no fields were assigned.

If format is a NULL pointer, the invalid parameter handler is invoked, as described in Parameter Validation. If execution is allowed to continue, these functions return EOF and set errno to EINVAL .

For information on these and other error codes, see _doserrno , errno , _sys_errlist , and _sys_nerr .

Remarks

The scanf function reads data from the standard input stream stdin and writes the data into the location given by argument . Each argument must be a pointer to a variable of a type that corresponds to a type specifier in format . If copying takes place between strings that overlap, the behavior is undefined.

When reading a string with scanf , always specify a width for the %s format (for example, " %32s " instead of " %s "); otherwise, improperly formatted input can easily cause a buffer overrun. Alternately, consider using scanf_s , _scanf_s_l , wscanf_s , _wscanf_s_l or fgets .

wscanf is a wide-character version of scanf ; the format argument to wscanf is a wide-character string. wscanf and scanf behave identically if the stream is opened in ANSI mode. scanf doesn't currently support input from a UNICODE stream.

The versions of these functions with the _l suffix are identical except that they use the locale parameter passed in instead of the current thread locale.

Generic-Text Routine Mappings

TCHAR.H routine _UNICODE & _MBCS not defined _MBCS defined _UNICODE defined
_tscanf scanf scanf wscanf
_tscanf_l _scanf_l _scanf_l _wscanf_l

Requirements

Routine Required header
scanf , * *_scanf_l ** <stdio.h>
wscanf , _wscanf_l <stdio.h> or <wchar.h>

The console is not supported in Universal Windows Platform (UWP) apps. The standard stream handles that are associated with the console, stdin , stdout , and stderr , must be redirected before C run-time functions can use them in UWP apps. For additional compatibility information, see Compatibility.

О предупреждениях и ошибках scanf () на языке C компиляции VS

Возникшие проблемы

Я бегу в VS, содержащий scanf() Предупреждение C6031 и ошибка C4996 возникли во время программы C.

error C4996: ‘scanf’: This function or variable may be unsafe. Consider using strcpy_s instead. To disable deprecation, use _CRT

Предупреждение C6031: возвращаемое значение игнорируется: может быть возвращено непредвиденное значение

Это мой код для проверки четности

Грамматика и формулировка правильные.

Потом много искал в Интернете и нашел удобное, полезное и основательное решение:

В верхней левой строке менюпроект--ВыбратьАтрибуты——C/C++--ВыбратьПредварительная обработка——Щелкнитередактировать-Добавить _CRT_SECURE_NO_WARNINGS




Интеллектуальная рекомендация


Michael.W Поговорите о Hyperledger Fabric. Проблема 20 - Подробная индивидуальная сортировка узла с пятью порядками с исходным кодом для чтения.

Michael.W Поговорите о Hyperledger Fabric. Проблема 20 - Подробная индивидуальная сортировка узла с пятью порядками с исходным кодом чтения Fabric Файл исходного кода одиночного режима находится в ord.


Мяу Пасс Матрица SDUT

Мяу Пасс Матрица SDUT Time Limit: 1000 ms Memory Limit: 65536 KiB Submit Statistic Problem Description Лянцзян получил матрицу, но эта матрица была особенно уродливой, и Лянцзян испытал отвращение. Чт.


Гессенская легкая двоичная структура удаленного вызова

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


TCP Pasket и распаковка и Нетти Solutions

Основные введение TCP является ориентированным на соединение, обеспечивая высокую надежность услуг. На обоих концах (клиенты и терминалы сервера) должны иметь один или более гнезда, так что передающий.

Читайте также: