В языке Си и его разновидностях существуют следующие функции для ввода данных с клавиатуры:
- cgets — чтение строки с консоли;
- getch — чтение символа с консоли;
- getche — чтение символа с эхопечатью;
- kbhit — проверка нажатия клавиши на консоли;
- cscanf — чтение данных с консоли по формату;
- getpass — ввод с терминала пароля без эхопечати.
Рассмотрим некоторые из них поподробнее
ФУНКЦИЯ | GETCH |
ОПИСАНА В: | /* Используется только для описания функции */ |
СИНТАКСИС: | int getch() ; |
НАЗНАЧЕНИЕ: | Ввод одиночного символа с консольного терминала без эхопечати (без вывода на дисплей). |
ФУНКЦИЯ ВОЗВРАЩАЕТ: | прочитанный символ. |
ПРИМЕЧАНИЕ: | функция getch использует входной поток stdin . |
char *cgets(str); char *str;
cgets читает символы до тех пор, пока не прочитаны символы и , или пока не будет прочитано установленное число символов. Прочитанная строка начинается со str[2] . Если прочитана комбинация / , эти символы будут располагаться за символом конца строки (ASCII 0). Действительная длина строки помещается в str[1] ;
C# ВВОД ДАННЫХ В КОНСОЛЬ | C# ОТ НОВИЧКА К ПРОФЕССИОНАЛУ | Урок # 5
В примере 5.3 иллюстрирована работа функции cgets .
/* Пример ex05003.c */ /* Определение констант — длины буфера */ #define LETTER_SIZE 50 // Максимальное число символов #define BUFF_SIZE 55 // Общий размер буфера = LETTER_SIZE+5 /* Объявление переменной буфера */ char *buff[BUFF_SIZE]; char csize; //служебная переменна /* Подготовительные операции и чтение с клавиатуры в буфер */ csize = BUFF_SIZE — 2; // Истинный размер буфера в символах buff[0] = csize; // Заносим это значение в буфер; (void) cgets( buff ); // Читаем с клавиатуры в буфер if( buff[1] > LETTER_SIZE ) goto ERROR; // Если переполнение буфера, следуем за ссылкой ERROR.
Благодаря механизму дескрипторов (двух первых «служебных» байтов строки-буфера) «переполнения буфера» достичь действительно сложно. MS-DOS просто не допустит чтения большего числа символов, чем это указано в байте buff[0] .
int cscanf( format ); char *format;
- Функция cscanf использует функцию getche для ввода символов;
- Каждый аргумент должен указывать на переменную того типа, который соответствует её описанию в строке: «format» . См. также описание функции scanf , в приложении №II (6.7) к «Буферизированный (потоковый) ввод-вывод» .
- количество элементов ввода, которые были успешно преобразованы и присвоены;
- значение EOF, если встретился символ — признак конца файла ;
- 0, если нет присвоенных областей.
int i; // Целая переменна /* Строка формата для ввода целого числа, состоящего из 10 знаков */ const char format[] = «%10d»; int ierr; // переменная ошибки ввода /* Ввод значения с консоли */ ierr = cscanf( format, if( ierr != 1 )goto ERROR; // переход, если ошибка ввода
char *getpass( prompt ); char *prompt;
ПРИМЕЧАНИЕ: Пароль хранится в статическом буфере (символьном массиве) функции и переписывается при каждом обращении к ней.
5.2.3. Консольный ввод в Quick Basic
Для ввода символов в Quick Basic используются одна функция и один оператор:
- функция INKEY$ — для ввода символов без эхопечати;
- оператор INPUT — для ввода значений, в том числе и форматированный ввод.
Рассмотрим эти функции поподробнее
При этом левый байт будет всегда нулевой, а правый содержит расширенный скен ход клавиши.
REM ФАЙЛ: «EX05005.BAS» REM ПРИМЕР ИСПОЛЬЗОВАНИЯ ФУНКЦИИ INKEY$ REM ОЖИДАЕМ НАЖАТИЯ КЛАВИШИ 100 C$ = INKEY$ IF C$ = «» GOTO 100 REM ПРОВЕРЯЕМ, НАЖАТА ЛИ «СЕРАЯ» КЛАВИША IF LEN( C$ ) = 2 GOSUB 2000 … REM «КОНСТРУКЦИЯ» ДЛЯ ОБРАБОТКИ СКЕН КОДОВ 2000 C$ = RIGHT( C$, 1 ) REM ПРЕОБРАЗУЕМ КОД В ЧИСЛО C = ASC( C$) REM НАЖАТА КЛАВИША «СТРЕЛКА ВЛЕВО» IF C = 75 THEN GOSUB 3000 REM НАЖАТА КЛАВИША «СТРЕЛКА ВПРАВО» IF C = 77 THEN GOSUB 3100 …
- Ввод символов завершается нажатием клавиши «Enter» ; код ASCII 13 не добавляется в конец строки;
- До нажатия этой клавиши текст можно редактировать средствами редактирования строки DOS;
- Оператор «не воспринимает» «серые клавиши» на клавиатуре. Реакция на такое нажатие зависит от реализации Бейсика.
Приведём пример ввода строки символов с консоли:
REM ФАЙЛ: «EX05006.BAS» REM ПРИМЕР ИСПОЛЬЗОВАНИЯ ФУНКЦИИ INPUT REM ВЫВОДИМ ПОДСКАЗКУ И ВВОДИМ СТРОКУ PRINT «Введите своё имя: «; INPUT NAME$ PRINT «Рад познакомиться с Вами, «; NAME$ STOP END
5.3. Резюме
Итак, Вы познакомились с основными «консольными» операциями по вводу-выводу символьных данных на консоль (клавиатуру и экран дисплея). Этот ввод-вывод является основным вводом-выводом MS-DOS , позволяющий «манипулировать» атрибутами дисплея и «прямым» чтением из буфера клавиатуры.
Однако на практике чаще используется потоковый ввод-вывод. Именно его мы и рассмотрим в следующем разделе.
Описание же скен-кодов клавиш клавиатуры и их обработки выходит за рамки данного курса.
Источник: intuit.ru
C# — научиться или умереть
После того долгого знакомства с переменными, этот урок может показаться быстрым и легким. Ну, в общем, ReadLine() — это еще один способ присвоить переменной значение.
Console.Write(«Введите имя и нажмите Enter: «); string name = Console.ReadLine(); Console.WriteLine(«Привет, » + name + «!»)
Фух! Миссия завершена! За три строки кода, мы запросили ввод, сохранили его и использовали. Вовсе не обязательно писать метод Write() перед ReadLine(), просто обычно надо каким-либо образом сказать пользователю, какой тип ввода мы ожидаем. Это просто вежливо.
Наверное, единственное затруднение — это то, что ReadLine() всегда возвращает данные строкового типа. Чтобы получить числа, надо опять же использовать методы классаConvert:
Console.Write(«Введите свой возраст и нажмите Enter: «); int age = Convert.ToInt32( Console.ReadLine() ); Console.Write(«Введите свой рост и нажмите Enter (можно использовать дроби):»); double height = Convert.ToDouble( Console.ReadLine() ); Console.WriteLine(«Значицца, вам лет, а рост .», age, height);
Надо запомнить, что без подобающего управления ошибками, программа будет выдавать ошибку каждый раз, когда мы будем пытаться конвертировать «пингвин»-а в число.
А что же с ReadLine() , который мы до сих пор ставили в конце каждой программы? Мы просто использовали преимущества системы ввода С#. Когда мы использовали ReadLine() в конце программы, мы заставляли С# терпеливо ждать, пока пользователь завершит ввод и нажмет ENTER.
Когда ENTER нажат, программа собирает всю информацию, что ввел пользователь и . ничего с ней не делает, потому что мы не присваиваем значение никакой переменной. Поэтому С# остается только пожать плечами, забыть все, что ввел пользователь и продолжить работу. Ну разве не грех не использовать такую возможность?
В любом случае, ввод пользователя один из самых коварных аспектов программирования. Невозможно перечислить количество случаев, когда неожиданный ввод может привести программу к внезапному краху! Позже мы узнаем, как же все-таки управляться с глупостью некоторых пользователей, а пока надо запомнить: любая часть кода, которая зависит от внешних данных, будь то ввод с консоли, текстовый файл, или сетевой накопитель — это потенциальная опасность краха и с ней надо обращаться с должной осторожностью. Ну, что ж, самое время для примера кода:
using System; namespace C_ConsoleInput < class Class1 < [STAThread] static void Main(string[] args) < // Запросить имя пользователя Console.Write(«Введите имя и нажмите Enter: «); // Прочесть данные; присвоить значение переменной «name» string name = Console.ReadLine(); // «name» можно использовать как обычную переменную Console.WriteLine(«Hello, » + name + «!»); // Сделаем это снова, только теперь запросим тип пиццы Console.Write(«Введите название пиццы и нажмите Enter: «); string pizza = Console.ReadLine(); // А теперь используем обе переменные Console.WriteLine(«Привет, ! Одна пицца на подходе!», name, pizza); // Используем ReadLine() с численными типами Console.Write(«Введите свой возраст и нажмите Enter: «); int age = Convert.ToInt32( Console.ReadLine() ); Console.Write(«Введите свой рост и нажмите Enter (можно использовать дроби): «); double height = Convert.ToDouble( Console.ReadLine() ); Console.WriteLine(«Значицца, вам лет, а рост .», age, height); // А теперь попросим пользователя нажать «Enter» для выхода из программы Console.Write(«Программа завершена. Нажмите \»Enter\» для выхода. «); Console.ReadLine(); > > >
Источник: ryakovlev.blogspot.com
Вывод данных на экран и ввод данных с клавиатуры
Сначала поговорим о выводе данных на монитор, так как вы, отчасти, уже с ним сталкивались в предыдущих уроках. Как вы помните, при помощи ключевого слова cout, мы можем вывести на монитор строку, которую пишем в “кавычках”, либо значение переменной, обратившись к ней по имени . Так же вы знакомы с оператором endl , который позволяет перевести вывод на следующую строку. И еще один важный момент – мы можем комбинировать вывод данных используя оператор несколько раз после cout :
Теперь мы познакомимся еще с несколькими специальными символьными последовательностями, которые помогут нам манипулировать выводом данных на экран. Вот перечень:
Вы посмотрели и задумались ))) Зачем использовать обратный слэш? Рассмотрим на примере. Нам надо вывести на экран цитату из фильма. Сразу пусть прозвучит сигнал, который привлечет внимание пользователя на экран. По центру разместим заголовок и название фильма, из которого цитируем, а ниже – цитату.На экране должно выглядеть так:
Постарайтесь набрать код самостоятельно! Решение ниже:
using namespace std ;
setlocale ( LC_ALL , «rus» ) ;
cout << «aaaaan» ;
cout << «tt\ Цитата из фильма «Джентльмены удачи» \ n» ;
cout << «— Мы вам приклеиваем парик.n» ;
cout << «— Так.n» ;
cout << «— Рисуем татуировку.n» ;
cout << «— Так.n» ;
cout << «— И сажаем в тюрьму.n» ;
cout << «— Так… А за что это?n» ;
Зачем нам нужен обратный слэш? Он говорит компилятору: “Внимание, за мной стоит не простой символ, а специальный! Он скажет тебе, что нужно сделать! :)” Вот в строке 8, если бы мы не использовали с вами обратный слэш, на экран бы пошёл вывод пяти символов а. А так, мы услышим “прекрасную музыку”. В строке 9 тоже интересно: две табуляции, далее надо вывести на экран один бэк слэш, а фактически надо написать два, ну и берём в кавычки название фильма. В конце каждой строки вместо манипулятора потока endl ( ) который позволяет перейти на новую строку (фактически аналог кнопки Enter на вашей клавиатуре) удобнее и короче, в данном случае, использовать управляющий символ n.
Теперь поговорим о вводе данных пользователем с клавиатуры. Мы уже знаем – чтобы присвоить значение переменной, её можно инициализировать при создании либо присвоить значение ниже по ходу программы: имяПеременной = значение; А сейчас мы научимся записывать в переменную значение, которое вводит пользователь с клавиатуры. Мы можем организовать ввод данных используя операторы cin и >> . Синтаксис следующий: cin >> имяПеременной . Рассмотрим эту возможность на примере:
using namespace std ;
setlocale ( LC_ALL , «rus» ) ;
int amount = 33 ;
int new_trees = 0 ;
cout << «Сколько деревьев вы посадили сегодня? » ;
cin >> new_trees ;
cout << «Количество деревьев в парке: » << amount << endl ;
cout << «Вы посадили » << new_trees << » деревьев.n» ;
cout << «Всего стало: » << amount + new_trees << endl ;
Запустите программу и обратите внимание – программа выполнит команду 11-й строки и, дойдя до оператора cin >> , остановится и начнется ожидание действия от пользователя. Надо ввести значение и нажать Enter. Как только переменная получит значение, введенное с клавиатуры, программа продолжит выполнение.
Стоит отметить, что cin понимает и различает типы переменных. И если ввести в int символ, а не цифру, значение переменной не изменится. А если ввести несоответствующее значение в переменную, которая не инициализирована при создании, на экран будет показан какой-то остаточный “мусор” из переменной. Чтобы вводить символы – переменные надо объявлять типа char . Мы обязательно вскоре научимся с вами проверять правильность ввода данных пользователем. А так же научимся вводить с клавиатуры не одиночные символы, а целые строки.
Дополнительное необходимое усилие от вас – просмотр видео-уроков 🙂 В них представлена и дополнительная информация не рассмотренная в статье. Смотрите всё! Для вас это только +
Желательно после прочтения теории приступить к практике – задачи тут.
Поделитесь этой статьей со своими друзьями. Мы будем благодарны! Все возникшие вопросы, задавайте в комментариях.
Источник: purecodecpp.com