Как использовать scanf в Visual Studio

Обновлено: 21.11.2024

В предыдущем упражнении вы уже узнали, как использовать функцию printf() для записи/отображения/печати/вывода символа/строки/текста на экран/терминал/стандартный вывод. В этом лабораторном занятии вы изучите другую функцию, scanf() или новую безопасную версию scanf_s() , о том, как принимать ввод со стандартного ввода, такого как клавиатура или пользователь.

Создайте новый пустой проект консольного приложения Win32 с именем myscanf и добавьте в проект исходный файл C++ с именем myscanfsrc. Убедитесь, что свойство вашего проекта настроено на компиляцию в виде кода C.

Введите следующий исходный код.

Соберите, запустите программу и покажите результат.

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

Определение семейства scanf() приведено в следующей таблице.

Описание

Чтение форматированных данных из стандартного потока ввода. Эти функции устарели и лучше использовать более безопасные версии scanf_s() , _scanf_s_l() , wscanf_s() , _wscanf_s_l() .

int scanf(const char *format [, аргумент]. );

int _scanf_l(const char *format, locale_t языковой стандарт [, аргумент]. );

int wscanf(const wchar_t *format [, аргумент]. );

int _wscanf_l(const wchar_t *format, locale_t языковой стандарт [, аргумент]. );

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

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

locale — используемая локаль.

сканировать("%64s", Имя);

Возвращает количество успешно преобразованных и назначенных полей; возвращаемое значение не включает поля, которые были прочитаны, но не присвоены. Возвращаемое значение 0 указывает на то, что поля не были назначены.

Если format является указателем NULL, вызывается обработчик недопустимых параметров. Если выполнение может быть продолжено, эти функции возвращают EOF и присваивают errno значение EINVAL .

stdio.h > или wchar.h > для wscanf() , _wscanf_l()

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

При чтении строки с помощью функции scanf() всегда указывайте ширину для формата %s (например, "%32s" вместо "%s"); в противном случае неправильно отформатированный ввод может легко вызвать переполнение буфера. В качестве альтернативы рассмотрите возможность использования безопасной версии scanf_s() , _scanf_s_l() , wscanf_s() , _wscanf_s_l() или fgets() .

wscanf() — это расширенная версия scanf(); аргумент формата для wscanf() представляет собой строку расширенных символов. wscanf() и scanf() ведут себя одинаково, если поток открыт в режиме ANSI. scanf() в настоящее время не поддерживает ввод из потока UNICODE.

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

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

Аргумент формата определяет интерпретацию ввода и может содержать один или несколько следующих элементов:

Описание

Пробелы

Пробел (' '); таб('\т'); или новая строка ('\n'). Символ пробела заставляет функцию scanf() считывать, но не сохранять все последовательные символы пробела во входных данных до следующего символа, отличного от пробела. Один пробел в формате соответствует любому числу (включая 0) и комбинации пробелов во входных данных.

Символы, не являющиеся пробелами

Кроме знака процента ( %). Символ, не являющийся пробелом, заставляет функцию scanf() читать, но не сохранять соответствующий символ, не являющийся пробелом. Если следующий символ во входном потоке не совпадает, scanf() завершает работу.

Спецификации формата

Обозначается знаком процента ( %). Спецификация формата заставляет scanf() считывать и преобразовывать символы ввода в значения указанного типа. Значение присваивается аргументу в списке аргументов.

Формат читается слева направо.Ожидается, что символы вне спецификаций формата будут соответствовать последовательности символов во входном потоке; совпадающие символы во входном потоке сканируются, но не сохраняются. Если символ во входном потоке конфликтует со спецификацией формата, scanf завершает работу, и символ остается во входном потоке, как если бы он не был прочитан.

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

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

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

Самая простая спецификация формата содержит только знак процента и символ типа (например, %s ). Если за знаком процента ( % ) следует символ, который не имеет значения в качестве символа управления форматом, этот символ и следующие за ним символы (до следующего знака процента) обрабатываются как обычная последовательность символов, т. е. последовательность символов, которая должна совпадать с вводом. Например, чтобы указать, что должен вводиться символ процента, используйте %% .

Звездочка ( * ) после знака процента подавляет назначение следующего поля ввода, которое интерпретируется как поле указанного типа. Поле сканируется, но не сохраняется. Например, scanf_s("%d", x, 20), где 20 байт зарезервировано для x.

Безопасные версии (с суффиксом _s) семейства функций scanf() требуют, чтобы параметр размера буфера передавался перед каждым параметром типа c , C , s , S или [ .

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

Спецификация ширины состоит из символов между % и спецификатором поля типа, который может включать положительное целое число, называемое полем ширины, и один или несколько символов, указывающих размер поля, которые также могут рассматриваться как модификаторы типа поля, например указание того, является ли целочисленный тип коротким или длинным. Такие символы называются префиксом размера. Например, scanf("%10d", x), где 10 – ширина поля.

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

Спецификация ширины является отдельной и отличной от аргумента размера буфера, необходимого для безопасных версий этих функций (например, scanf_s() , wscanf_s() и т. д.). В следующем примере спецификация ширины равна 20, что указывает на то, что из входного потока должно быть прочитано до 20 символов. Длина буфера составляет 21, что включает место для возможных 20 символов плюс завершающий нуль:

Если поле ширины не используется, функция scanf() попытается прочитать весь токен в строку. Если указанный размер недостаточен для хранения всего маркера, в целевую строку ничего не будет записано. Если указано поле ширины, то первые символы ширины в токене будут записаны в целевую строку вместе с ограничителем null.

Необязательные префиксы h , l , ll , I64 и L указывают размер аргумента (длинный или короткий, однобайтовый символ или широкий символ, в зависимости от типа символа, который они изменяют). Эти символы спецификации формата используются с символами типа в функциях scanf() или wscanf() для указания интерпретации аргументов, как показано в следующей таблице. Префикс типа I64 является расширением Microsoft и несовместим с ANSI/ISO.Символы типа и их значения описаны в таблице "Символы типа для функций scanf()" в разделе Символы поля типа scanf(). Префиксы h, l и L являются расширениями Microsoft при использовании с данными типа char. Вы можете не найти его в других компиляторах C/C++.

Префиксы размера для scanf() и wscanf() перечислены в следующей таблице.

Одна из проблем, возникающих после установки языка программирования C в Microsoft Visual Studio, иногда автоматически не отображаются числовые строки, что приходится делать вручную.

Чтобы решить эту проблему, мы напишем программу:

Где мы собираемся написать программу, в которой мы будем спрашивать чей-то возраст, спрашивая год его рождения.

После того, как вы запустите свой код, у вас появится сообщение:

"Возвращаемое значение игнорируется: "scanf""

" 'scanf': эта функция или переменная могут быть небезопасными"

Зеленая линия в коде сканирования останется неподвижной, но ваш код будет работать без проблем.

Вывод после запуска кода на этот раз

Чтобы отключить предупреждение в файле для всего последующего, используйте директиву warning.

Если хотите, можете скопировать код отсюда:

printf("Введите год своего рождения");

возраст = 2022 – год рождения;

printf(" ваш возраст = %d\n ", возраст);

Связанные

Похожие сообщения

Команда БПЛА Гокпусу

Как удалить водяной знак с фотографии xiaomi?

как определить, 32- или 64-разрядная версия вашего компьютера

Подключение Raspberry pi к pixhawk (Mav link 1 не работает)

Оставить комментарий Отменить ответ

Причины обесцвечивания волос и пути решения

Мы разъясняем проблему поседения волос, которая рассматривается как эстетическая проблема, которой многие из нас боятся… Подробнее…

5 турецких повседневных идиом

ГОРМЕЗДЕН ГЕЛЬМЕК

Лексическое значение: игнорировать

Значение идиомы: На самом деле вы осознаете, но сознательно предпочитаете притворяться, что не видите этого. Подробнее…

Как удалить водяной знак с фотографии xiaomi?

Пользовательский интерфейс Xiaomi MIUI работает поверх Android на телефонах Redmi. В сентябре 2019 года количество пользователей Redmi… Читать дальше…

Подключение Raspberry pi к pixhawk (Mav link 1 не работает)

Вот решение, как подключить Raspberry pi и pixhwak через USB (без использования кабеля DF13).

Куда пойти в Кушадасы

Приложение для восстановления файлов для Android

Возможна потеря и повреждение данных.

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

Рис для кожи и рецепты рисовых масок для лица

ПРЕИМУЩЕСТВА РИСА ДЛЯ КОЖИ И РЕЦЕПТЫ РИСОВЫХ МАСОК ДЛЯ ЛИЦА Секрет красоты восточноазиатских женщин из прошлого! Как… Подробнее…

Два сайта, которые сделали мой сайт лучше, чем когда-либо

Мой первый веб-сайт Я всегда хотел иметь веб-сайт, но не знал, как это сделать, и я… Читать далее…

Рекомендации по размещению в Кушадасах

Когда мы проводим исследование о размещении, мы обычно получаем недостаточно информации. Хотя Кушадасы — небольшой курортный регион, здесь есть много вариантов… Читать дальше…

Топ-5 криптовалют с большим объемом и низким предложением

Для лучшего хостинга веб-сайта

Авторское право © 2022 | Бенсрайтинг

Обзор конфиденциальности

Потому что я только изучаю язык C , Впервые у меня возникла эта проблема , я не знаю, что происходит , А потом я изучал его в Chrome , Просто знаю почему , И нашел несколько разбросанных по каждому угол решения, Позвольте мне подвести итог здесь.

Вопрос, почему :

остайтесь ANSI C. Есть только scanf(), нет, scanf_s(), однако scanf() не проверяет границы при чтении, так что это может привести к утечке памяти. поэтому Microsoft Компания в VS Компилятор предоставляет scanf_s(). Если вы хотите продолжать использовать scanf. Эта небезопасная функция, ее можно решить следующими способами.

Метод ①:

удерживать scanf Изменить на :scanf_s

Это зависит от компилятора VS. Поскольку я считаю, что scanf() небезопасен, он определяет один из своих собственных scanf_s().

Метод ②:

Причиной ошибки компилятора является проверка VS Medium SDL. Просто найдите ее и выключите.

Закройте шаги: щелкните правой кнопкой мыши «Документы проекта» —— «атрибут» —— «Свойства конфигурации» ——«C/C++»——«процедура»——«Проверка SDL». Измените его на «нет», что сделать, как показано на рисунке

После изменения на No компилировать снова можно .

Метод ③:

// Выключаем все это

Метод ④:

// Игнорировать обнаружение безопасности

Каждый раз, когда вы добавляете эту строку кода, это кажется немного сложным???( Когда я впервые нашел этот метод, мое первое чувство было таким же )

На самом деле, это не так уж и сложно, его также можно разделить на два метода:

(1) Все, что нам нужно сделать, это добавить в VS _CRT_SECURE_NO_WARNINGS Этот макрос в порядке. Конкретная операция показана на рисунке ниже:

(2) оставайтесь VS2019 По пути установки «newc++file.cpp». Этот файл откройте. В режиме Блокнота , Скопируйте и вставьте эту строку кода , И сохраните ее , Таким образом, после каждого нового .c Эта строка кода будет автоматически появляться на первой строке при создании исходного файла .

【Будьте осторожны 】 Если во время сохранения появляется сообщение «Отказано в доступе» Ситуация, Вы можете протестировать, загрузить и установить инструмент «Блокнот++», Затем запустите программное обеспечение от имени администратора, Используйте это программное обеспечение, чтобы открыть вышеупомянутый файл «newc++file.cpp», скопируйте и вставьте код, сохраните его.

Последние два упомянутых действия выполняются за один раз, вам не нужно делать это сзади.

Лично я предпочитаю метод ④ из (1) методов. Я также рекомендую вам использовать этот метод —— Ведь это просто и это можно сказать раз и навсегда

VS2019 в scanf Проблема игнорирования возвращаемого значения и ее решение

Недавно я писал страницу, используя jquery ajax, чтобы реализовать суждение. Нет проблем, просто написание теста. Через два дня я обнаружил, что есть проблема. Без суждения. Получается, что всем предупреждениям Возвращаемому значению будет предшествовать несколько символов новой строки и пробелов. (Я до сих пор не понимаю, Тот же компьютер, То же, что и .

Если поля в классе сущностей и таблице базы данных не согласованы Измененные свойства . Чтобы перегенерировать геттер и сеттер также метод toString В тестовом классе соответствующий набор Вы будете сообщать об ошибках во всех используемых вами методах. Просто измените на последний набор Метод в порядке. .

в , Мы подробно объясним, как использовать _version для подтверждения .

Краткое введение в LVS Интернет Быстрый рост мультимедийных сетевых серверов приводит к быстрому увеличению количества доступов. Сервер должен иметь возможность предоставлять большое количество одновременных услуг доступа. Поэтому для сервера с большой нагрузкой, говорят, CPU.I/O Вычислительная мощность скоро станет узким местом. Из-за одной станции .

иногда используйте linux shell. Вам нужно посмотреть полный путь к текущему местоположению, когда вы находитесь, иметь доступ к команде pwd. Конечно, как только вы узнаете команду, вы можете пройти через man pwd, чтобы увидеть все справочные руководства для этой команды .

PL/SQL Developer Нет данных при использовании запроса условия на китайском языке. Это связано с несоответствием набора символов. Выполните следующую команду sql: выберите userenv('language') from dual; Показать :SIM .

Я изучаю Java Базовые знания , Изучая HashMap Когда дело доходит до знаний , я понимаю HashMap Проблема параллелизма , Запишите здесь , Углубите понимание (Эта статья основана на Java1.7 Of , В основном чтобы быть более интуитивно понятным, обновленная версия .

Д. Xenia и Bit Operations лимит времени на тест: 2 секунды лимит памяти на тест: 256 мегабайт ввод: .

Поскольку я только начал использовать VS2019 для изучения языка C, я впервые столкнулся с такой проблемой и не знал, что происходит. Затем я пошел в Chrome, чтобы изучить его, и я знал причину, и я нашел несколько разбросанных по каждому углу. Решение я подытожу здесь.

причины проблемы:

В ANSI C есть только функция scanf() и нет функции scanf_s(), но функция scanf() не проверяет границу при чтении, что может привести к утечке памяти. Поэтому Microsoft предоставляет scanf_s() в компиляторе VS. Если вы хотите продолжать использовать небезопасную функцию scanf, вы можете решить эту проблему следующими способами.

Метод ①:

Замените scanf на: scanf_s

Это уникально для компилятора VS. Поскольку scanf() считается небезопасным, он определяет функцию scanf_s().

Метод ②:

Причина сообщения об ошибке компилятора Что касается проверки SDL в VS, вам нужно только найти ее и закрыть.

Действия для закрытия: щелкните правой кнопкой мыши «Файл проекта» — «Свойства» — «Свойства конфигурации» — «C/C++» — «Общие» — «Проверка SDL» и выберите «Нет»,

измените, как показано После этого вы можете скомпилировать его снова.

Метод ③:

//Показать только один

Метод ④:

//Игнорировать проверку безопасности

. Не кажется ли вам утомительным каждый раз добавлять такую ​​строку кодов? ? (Когда я впервые нашел этот метод, первое ощущение было таким же)

На самом деле, это не должно быть таким хлопотным, нам нужно только добавить макрос _CRT_SECURE_NO_WARNINGS в VS. , Конкретная операция показана на рисунке ниже: сделайте это

один раз, больше не делайте этого позже. Лично я предпочитаю первый метод.

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