Ввод символов с клавиатуры почти не отличается от ввода чисел с клавиатуры. Для того чтобы ввести какие-то символы (буквы, знаки и т.д.) с клавиатуры необходимо для переменных использовать символьный тип данных Char.
program number14; uses crt; var X, Y:char; begin clrscr; writeln (‘Введите несколько символов: ’); readln(X); writeln(X); writeln (‘Введите еще несколько символов: ’); readln(X,Y); writeln(X,Y); readln end.
В строке №3 записываем переменные X и Y и указываем для них тип данных Char. Теперь в эти переменные можно записывать символы, выводить их на экран и т.д.
Строка №7. Вводим с клавиатуры какие-нибудь символы. Одна переменная типа Char может содержать только один символ. Поэтому при вводе символов с клавиатуры, в переменную X запишется только один символ (первый). Поэтому, сколько бы символов мы не вводили с клавиатуры, на экран (строка №8) выведется только первый из этих символов.
В строке №10 в операторе Readln записано уже 2 переменных X и Y. И в строке №11 на экран выводится значения этих двух переменных. Поэтому на экран выведется 2 первых из введенных символов.
22. Консольный ввод-вывод. Символы, escape-последовательности, потоки [Универсальный программист]
Вводим любое слово, например «pascal» и нажимаем Enter. Затем вводим еще какое-нибудь слово, пусть тоже будет «Pascal» и нажимаем Enter.
Как видно, в первом случае программа вывела только первую букву слова, во втором случае 2 первых буквы. Таким образом, можно сделать вывод о том, что одна переменная типа Char принимает только один символ из введенной строки. Для того чтобы можно было записать несколько символов в одну переменную необходимо использовать строковые переменные и тип данных String.
Источник: mojainformatika.ru
Ввод с клавиатуры (начало работы с Win32 и C++)
Клавиатура используется для нескольких различных типов ввода, в том числе:
- Ввод символов. Текст, который пользователь вводит в документ или поле редактирования.
- Сочетания клавиш. Росчерки клавиш, вызывающие функции приложения; Например, нажмите клавиши CTRL+O, чтобы открыть файл.
- Системные команды. Росчерки клавиш, вызывающие системные функции; например, ALT+TAB для переключения окон.
При вводе с клавиатуры важно помнить, что нажатие клавиши не совпадает с символом. Например, нажатие клавиши A может привести к любому из следующих символов.
- а
- Объект
- á (если клавиатура поддерживает объединение диакритических элементов)
Кроме того, если клавиша ALT удерживается, нажатие клавиши A приведет к возникновению клавиш ALT+A, которые система обрабатывает не как символ, а как системную команду.
5 Ввод и вывод данных python. Команда input()
Коды ключей
При нажатии клавиши оборудование создает код сканирования. Коды сканирования зависят от клавиатуры к другой, и существуют отдельные коды сканирования для событий нажатия клавиш и нажатия клавиш. Вы почти никогда не будете заботиться о кодах сканирования. Драйвер клавиатуры преобразует коды сканирования в коды виртуальной клавиши.
Коды виртуальных ключей не зависят от устройств. При нажатии клавиши A на любой клавиатуре создается тот же код виртуальной клавиши.
Как правило, коды виртуальных ключей не соответствуют кодам ASCII или любому другому стандарту кодировки символов. Это очевидно, если вы думаете, потому что один и тот же ключ может генерировать разные символы (a, A, á), а некоторые клавиши, например функциональные клавиши, не соответствуют ни одному символу.
При этом следующие коды виртуальных ключей сопоставляют с эквивалентами ASCII:
- От 0 до 9 клавиш = ASCII ‘0’ – ‘9’ (0x30 – 0x39)
- Клавиши A–Z = ASCII «A» – «Z» (0x41 – 0x5A)
В некоторых отношениях это сопоставление является неудачным, так как никогда не следует рассматривать коды виртуальных ключей как символы по рассматриваемым причинам.
Файл заголовка WinUser.h определяет константы для большинства кодов виртуальных ключей. Например, код виртуального ключа для клавиши СТРЕЛКА ВЛЕВО VK_LEFT (0x25). Полный список кодов виртуальных ключей см. в разделе Коды виртуальных ключей. Для кодов виртуальных ключей, соответствующих значениям ASCII, константы не определены.
Например, код виртуального ключа для ключа A 0x41, но константы с именем VK_A нет. Вместо этого используйте просто числовое значение.
сообщения Key-Down и Key-Up
При нажатии клавиши окно с фокусом клавиатуры получает одно из следующих сообщений.
Сообщение WM_SYSKEYDOWN указывает системный ключ, который является росчерком ключа, который вызывает системную команду. Существует два типа системных ключей:
- ALT + любая клавиша
- F10
Клавиша F10 активирует строку меню окна. Различные сочетания клавиш ALT вызывают системные команды. Например, ALT+TAB переключается в новое окно. Кроме того, если в окне есть меню, для активации пунктов меню можно использовать клавишу ALT. Некоторые сочетания клавиш ALT ничего не делают.
Все остальные росчерки клавиш считаются несистемными ключами и создают WM_KEYDOWN сообщение. Сюда входят функциональные ключи, отличные от F10.
При освобождении ключа система отправляет соответствующее сообщение о ключе:
Если вы удерживаете клавишу достаточно долго, чтобы запустить функцию повторения клавиатуры, система отправляет несколько сообщений вниз, а затем одно сообщение клавиши вверх.
Во всех четырех сообщениях клавиатуры, рассмотренных на данный момент, параметр wParam содержит код виртуальной клавиши. Параметр lParam содержит некоторые прочие сведения, упакованные в 32 бита. Как правило, информация в lParam не требуется. Один из флагов, который может быть полезен, — бит 30, флаг «предыдущее состояние ключа», который имеет значение 1 для повторяющихся сообщений о нажатии клавиши.
Как следует из названия, росчерки системных ключей в первую очередь предназначены для использования операционной системой. При перехвате сообщения WM_SYSKEYDOWN вызовите DefWindowProc . В противном случае вы заблокируйте обработку команды операционной системой.
Символьные сообщения
Ключевые штрихи преобразуются в символы с помощью функции TranslateMessage , которую мы впервые видели в модуле 1. Эта функция проверяет сообщения, отправляемые клавишами, и преобразует их в символы. Для каждого создаваемого символа функция TranslateMessage помещает WM_CHAR или WM_SYSCHAR сообщение в очередь сообщений окна. Параметр wParam сообщения содержит символ UTF-16.
Как можно догадаться, WM_CHAR сообщения создаются из WM_KEYDOWN сообщений, а WM_SYSCHAR — из WM_SYSKEYDOWN сообщений. Например, предположим, что пользователь нажимает клавишу SHIFT, а затем клавишу A. Предполагая стандартную раскладку клавиатуры, вы получите следующую последовательность сообщений:
WM_KEYDOWN: SHIFT
WM_KEYDOWN: A
WM_CHAR: «A»
С другой стороны, сочетание ALT+P создаст следующее:
WM_SYSKEYDOWN: VK_MENU
WM_SYSKEYDOWN: 0x50
WM_SYSCHAR: «p»
WM_SYSKEYUP: 0x50
WM_KEYUP: VK_MENU
(Код виртуального ключа для клавиши ALT называется VK_MENU по историческим причинам.)
Сообщение WM_SYSCHAR указывает системный символ. Как и в случае с WM_SYSKEYDOWN, обычно это сообщение следует передавать непосредственно в DefWindowProc. В противном случае вы можете помешать стандартным системным командам. В частности, не следует рассматривать WM_SYSCHAR как текст, введенный пользователем.
Сообщение WM_CHAR обычно считается символьным вводом. Тип данных для символа — wchar_t, представляющий символ Юникода UTF-16. Ввод символов может включать символы за пределами диапазона ASCII, особенно с раскладками клавиатуры, которые обычно используются за пределами США. Вы можете попробовать различные раскладки клавиатуры, установив региональную клавиатуру, а затем используя функцию экранной клавиатуры.
Пользователи также могут установить редактор метода ввода (IME) для ввода сложных скриптов, таких как японские символы, с помощью стандартной клавиатуры. Например, с помощью японского редактора IME для ввода символа катаканы カ (ka) могут появиться следующие сообщения:
WM_KEYDOWN: VK_PROCESSKEY (клавиша IME PROCESS)
WM_KEYUP: 0x4B
WM_KEYDOWN: VK_PROCESSKEY
WM_KEYUP: 0x41
WM_KEYDOWN: VK_PROCESSKEY
WM_CHAR: カ
WM_KEYUP: VK_RETURN
Некоторые сочетания клавиш CTRL претворяются в управляющие символы ASCII. Например, СОЧЕТАНИЕ КЛАВИШ CTRL+A преобразуется в символ ASCII CTRL-A (SOH) (значение ASCII 0x01). Для ввода текста обычно следует отфильтровать управляющие символы. Кроме того, не используйте WM_CHAR для реализации сочетаний клавиш.
Вместо этого используйте WM_KEYDOWN сообщения; или, что еще лучше, используйте таблицу ускорителей. Таблицы ускорителей описаны в следующем разделе Таблицы ускорителей.
В следующем коде отображаются сообщения main клавиатуры в отладчике. Попробуйте играть с различными сочетаниями нажатий клавиш и посмотреть, какие сообщения создаются.
Обязательно включите wchar.h, иначе swprintf_s будет неопределенным.
LRESULT CALLBACK WindowProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam) < wchar_t msg[32]; switch (uMsg) < case WM_SYSKEYDOWN: swprintf_s(msg, L»WM_SYSKEYDOWN: 0x%xn», wParam); OutputDebugString(msg); break; case WM_SYSCHAR: swprintf_s(msg, L»WM_SYSCHAR: %cn», (wchar_t)wParam); OutputDebugString(msg); break; case WM_SYSKEYUP: swprintf_s(msg, L»WM_SYSKEYUP: 0x%xn», wParam); OutputDebugString(msg); break; case WM_KEYDOWN: swprintf_s(msg, L»WM_KEYDOWN: 0x%xn», wParam); OutputDebugString(msg); break; case WM_KEYUP: swprintf_s(msg, L»WM_KEYUP: 0x%xn», wParam); OutputDebugString(msg); break; case WM_CHAR: swprintf_s(msg, L»WM_CHAR: %cn», (wchar_t)wParam); OutputDebugString(msg); break; /* Handle other messages (not shown) */ >return DefWindowProc(m_hwnd, uMsg, wParam, lParam); >
Прочие сообщения клавиатуры
Некоторые другие сообщения клавиатуры можно игнорировать в большинстве приложений.
- Сообщение WM_DEADCHAR отправляется для комбинирования ключа, например для диакритического ключа. Например, на испанской клавиатуре при вводе акцента (‘) и E создается символ é. Для символа акцента отправляется WM_DEADCHAR.
- Сообщение WM_UNICHAR устарело. Это позволяет программам ANSI получать входные данные в Юникоде.
- Символ WM_IME_CHAR отправляется, когда IME преобразует последовательность нажатия клавиш в символы. Оно отправляется в дополнение к обычному WM_CHAR сообщению.
Состояние клавиатуры
Сообщения клавиатуры управляются событиями. То есть вы получите сообщение, когда происходит что-то интересное, например нажатие клавиши, и сообщение сообщает вам, что только что произошло. Но вы также можете проверить состояние ключа в любое время, вызвав функцию GetKeyState .
Например, рассмотрим, как определить сочетание щелчка левой кнопкой мыши и клавиши ALT. Вы можете отслеживать состояние клавиши ALT, прослушивая сообщения об росчерке клавиш и сохраняя флаг, но GetKeyState избавляет вас от проблем. Когда вы получите сообщение WM_LBUTTONDOWN , просто вызовите GetKeyState следующим образом:
if (GetKeyState(VK_MENU) // ALT key is down. >
Сообщение GetKeyState принимает код виртуального ключа в качестве входных данных и возвращает набор битовых флагов (на самом деле всего два флага). Значение 0x8000 содержит битовый флаг, который проверяет, нажата ли клавиша в данный момент.
Большинство клавиатур имеет две клавиши ALT: левую и правую. В предыдущем примере проверяется, был ли нажат любой из них. Вы также можете использовать GetKeyState , чтобы различать левый и правый экземпляры клавиш ALT, SHIFT или CTRL. Например, следующий код проверяет, нажата ли правая клавиша ALT.
if (GetKeyState(VK_RMENU) // Right ALT key is down. >
Функция GetKeyState интересна тем, что она сообщает о состоянии виртуальной клавиатуры. Это виртуальное состояние основано на содержимом очереди сообщений и обновляется при удалении сообщений из очереди. По мере обработки сообщений окна программа GetKeyState предоставляет snapshot клавиатуры во время постановки каждого сообщения в очередь. Например, если последнее сообщение в очереди было WM_LBUTTONDOWN, GetKeyState сообщает о состоянии клавиатуры в тот момент, когда пользователь нажал кнопку мыши.
Так как GetKeyState основан на очереди сообщений, он также игнорирует ввод с помощью клавиатуры, отправленный в другую программу. Если пользователь переключается на другую программу, все нажатия клавиш, отправляемые в нее, игнорируются Командлетом GetKeyState. Если вы действительно хотите узнать непосредственное физическое состояние клавиатуры, для этого есть функция : GetAsyncKeyState. Однако для большинства кода пользовательского интерфейса правильная функция — GetKeyState.
Источник: learn.microsoft.com
ввод данных
char *fgets(char *str, int num, FILE *stream) — читает до num-1 символов или пока не встретится ‘n’ или EOF из потока stream и помещает их в массив символов, на который указывает str. По окончании считывания в массив str сразу после последнего считанного символа помещается нулевой символ.
! Символ ‘n’ после чтения меньше чем num-1 станет частью массива str.
При вызове fgets(ptr, N — 1, stdin);
где объявлено char ptr[N];
Для различных типов данных используется функция scanf()
int scanf(const char *управляющая_строка, . ); — читает и интерпретирует вводимые пользователем символы в зависимости от управляющей строки
и возвращает количество тех элементов данных, которым было успешно присвоено значение и в случае ошибки EOF.
НО оставляет после себя символы во входном потоке.
Так как читает либо до первого разделителя (‘ ‘, ‘n’, ‘t’) либо заданное число символов
При попытке игнорировать разделители, например, scanf(«%dn», забрать», например, fgets(str, N — 1, stdin);
и если уверены, что останется только один символ getchar();
Управляющая строка состоит из символов трех видов:
- спецификаторов преобразования,
- разделителей (пробел, перевод строки, табуляция),
- других символов, не являющихся разделителями.
Спецификаторы преобразования
В отличие от scanf scanf_s требу ет , чтобы вы указали размеры буфера для некоторых параметров. Укажите размеры для всех параметров со спецификаторами %c , %C , %s , %S или набора элементов управления строкой [] . Размер буфера в символах передается как дополнительный параметр в функции scanf_s . Он следует сразу за указателем на буфер или переменную.
ИЛИ явно scanf_s(«%1c»,
Подробно об использовании scanf
Ввод чисел
Для чтения целого числа используйте спецификатор преобразования %d или %i. A для чтения числа с плавающей точкой, представленного в стандартном или экспоненциальном виде, используйте спецификатор преобразования %e, %f или %g. (Кроме того, для чтения числа с плавающей точкой стандарт С99 разрешает использовать также спецификатор преобразования %a.)
Функцию scanf() можно использовать для чтения целых значений в восьмеричной или шестнадцатеричной форме, применяя для этого соответственно команды форматирования %o и %x, последняя из которых может быть как на верхнем, так и на нижнем регистре. Когда вводятся шестнадцатеричные числа, то буквы от А до F, представляющие шестнадцатеричные цифры, должны быть на том же самом регистре, что и литера-спецификатор. Следующая программа читает восьмеричное и шестнадцатеричное число:
Функция scanf() прекращает чтение числа тогда, когда встречается первый нечисловой символ.
Ввод целых значений без знака
Для ввода целого значения без знака используйте спецификатор формата %u. Например, операторы
выполняют считывание целого числа без знака и присваивают его переменной num.
Чтение одиночных символов с помощью scanf()
Как уже говорилось в этой главе, одиночные символы можно прочитать с помощью функции getchar() или какой-либо функции, родственной с ней. Для той же цели можно использовать также вызов функции scanf() со спецификатором формата %c. Но, как и большинство реализаций getchar(), функция scanf() при использовании спецификатора преобразования %c обычно будет выполнять построчно буферизованный ввод. В интерактивной среде такая ситуация вызывает определенные трудности.
При чтении одиночного символа символы разделителей читаются так же, как и любой другой символ, хотя при чтении данных других типов разделители интерпретируются как разделители полей. Например, при вводе с входного потока «x y» фрагмент кода
помещает символ x в a, пробел — в b, а символ y — в c.
Чтение строк
Для чтения из входного потока строки можно использовать функцию scanf() со спецификатором преобразования %s. Использование спецификатора преобразования %s заставляет scanf() читать символы до тех пор, пока не встретится какой-либо разделитель.
Читаемые символы помещаются в символьный массив, на который указывает соответствующий аргумент, а после введенных символов еще добавляется символ конца строки (‘0’). Что касается scanf(), то таким разделителем может быть пробел, разделитель строк, табуляция, вертикальная табуляция или подача страницы. В отличие от gets(), которая читает строку, пока не будет нажата клавиша , scanf() читает строку до тех пор, пока не встретится первый разделитель. Это означает, что scanf() нельзя использовать для чтения строки «это испытание», потому что после пробела процесс чтения прекратится. Чтобы увидеть, как действует спецификатор %s, попробуйте при выполнении этой программы ввести строку «привет всем»:
printf(«Вот Ваша строка: %s», str);
Программа выведет только часть строки, то есть слово привет.
Ввод адреса
Для ввода какого-либо адреса памяти используйте спецификатор преобразования %p. Этот спецификатор преобразования заставляет функцию scanf() читать адрес в том формате, который определен архитектурой центрального процессора. Например, следующая программа вначале вводит адрес, а затем отображает то, что находится в памяти по этому адресу:
printf(«По адресу %p находится %cn», p, *p);
Спецификатор %n
Спецификатор %n указывает, что scanf() должна поместить количество символов, считанных (до того момента, когда встретился %n) из входного потока в целую переменную, указанную соответствующим аргументом.
Использование набора сканируемых символов
Функция scanf() поддерживает спецификатор формата общего назначения, называемый набором сканируемых символов (scanset). Набор сканируемых символовпредставляет собой множество символов. Когда scanf() обрабатывает такое множество, то вводит только те символы, которые входят в набор сканируемых символов. Читаемые символы будут помещаться в массив символов, который указан аргументом, соответствующим набору сканируемых символов. Этот набор определяется следующим образом: все те символы, которые предстоит сканировать, помещают в квадратные скобки. Непосредственно перед открывающей квадратной скобкой должен находиться знак %. Например, следующий набор сканируемых символов дает указание scanf() сканировать только символы X, Y и Z:
При использовании набора сканируемых символов функция scanf() продолжает читать символы, помещая их в соответствующий массив символов, пока не встретится символ, не входящий в этот набор. При возвращении из scanf() в массиве символов будет находиться строка, состоящая из считанных символов, причем эта строка будет заканчиваться символом конца строки. Чтобы увидеть, как это все работает, запустите следующую программу:
char str[80], str2[80];
printf(«%d %s %s», i, str, str2);
Введите 123abcdtye, а затем нажмите клавишу . После этого программа выведет 123 abed tye. Так как в данном случае ‘t’ не входит в набор сканируемых символов, то scanf() прекратила чтение символов в переменную str сразу после того, как встретился символ ‘t’. Оставшиеся символы были помещены в переменную str2.
Кроме того, можно указать набор сканируемых символов, работающий с точностью до наоборот; тогда первым символом в таком наборе должен быть ^. Этот символ дает указание scanf() принимать любой символ, который не входит в набор сканируемых символов.
В большинстве реализаций для указания диапазона можно использовать дефис. Например, указанный ниже набор сканируемых символов дает функции scanf()указание принимать символы от А до Z:
Следует обратить внимание на такой важный момент: набор сканируемых символов чувствителен к регистру букв. Если нужно сканировать буквы и на верхнем, и на нижнем регистре, то их надо указывать отдельно для каждого регистра.
Пропуск лишних разделителей
Разделитель в управляющей строке дает scanf() указание пропустить в потоке ввода один или несколько начальных разделителей. Разделителями являются пробелы, табуляции, вертикальные табуляции, подачи страниц и разделители строк. В сущности, один разделитель в управляющей строке заставляет scanf()читать, но не сохранять любое количество (в том числе и нулевое) разделителей, которые находятся перед первым символом, не являющимся разделителем.
Символы в управляющей строке, не являющиеся разделителями
Если в управляющей строке находится символ, не являющийся разделителем, то функция scanf() прочитает символ из входного потока, проверит, совпадает ли прочитанный символ с указанным в управляющей строке, и в случае совпадения пропустит прочитанный символ. Например, «%d,%d» заставляет scanf()прочитать целое значение, прочитать запятую и пропустить ее (если это была запятая!), а затем прочитать следующее целое значение. Если же указанный символ во входном потоке не будет найден, то scanf() завершится. Когда нужно прочитать и отбросить знак процента, то в управляющей строке следует указать %%.
Функции scanf() необходимо передавать адреса
Для всех переменных, которые должны получить значения с помощью scanf(), должны быть переданы адреса. Это означает, что все аргументы должны быть указателями. Вспомните, что именно так в С создается вызов по ссылке и именно тогда функция может изменить содержимое аргумента. Например, для считывания целого значения в переменную count можно использовать такой вызов функции scanf():
Строки будут читаться в символьные массивы, а имя массива без индекса является адресом первого его элемента. Таким образом, чтобы прочитать строку в символьный массив, можно использовать оператор
В этом случае str является указателем, и потому перед ним не нужно ставить оператор оно ограничивает число символов, считываемых из этого поля. Например, чтобы считывать в переменную str не более 20 символов, пишите
Если поток ввода содержит больше 20 символов, то при следующем вызове функций ввода считывание начнется после того места, где оно закончилось при предыдущем вызове. Например, если вы в ответ на вызов scanf() из этого примера введете
то в str из-за спецификатора максимальной ширины поля будет помещено только 20 символов, то есть символы вплоть до Т. Это значит, что оставшиеся символы UVWXYZ пока еще не прочитаны. При следующем вызове scanf(), например при выполнении оператора
в str будут помешены буквы UVWXYZ. Ввод из поля может завершиться и до того, как будет достигнута максимальная длина поля — если встретится разделитель. В таком случае scanf() переходит к следующему полю.
Чтобы прочитать длинное целое, перед спецификатором формата поместите l (эль). А для чтения короткого целого значения перед спецификатором формата следует поместить n. Эти модификаторы можно использовать со следующими кодами форматов: d, i, o, u, x и n.
По умолчанию спецификаторы f, e и g дают scanf() указание присваивать данные переменной типа float. Если перед одним из этих спецификаторов будет помещен l (эль), то scanf() будет присваивать данные переменной типа double. Использование L дает scanf() указание, чтобы переменная, принимающая данные, имела тип long double.
Если в компиляторе предусмотрена обработка двухбайтовых символов [1] , добавленных в язык С Поправкой 1 от 1995 года, то модификатор l можно также использовать с такими кодами формата, как c и s. l непосредственно перед c является признаком указателя на объект типа wchar_t. А l непосредственно перед s — признак указателя на массив элементов типа wchar_t. Кроме того, l также применяется для модификации набора сканируемых символов, чтобы этот набор можно было использовать для двухбайтовых символов.
В Стандарте С99, кроме перечисленных, предусмотрены также модификаторы ll и hh, последний из которых можно применять к спецификаторам d, i, o, u, xили n. Он является признаком того, что соответствующий аргумент является указателем на значение, типа signed или unsigned char. Кроме того, к спецификаторам d, i, o, u, x и n можно применять и ll, этот спецификатор является признаком того, что соответствующий аргумент является указателем на значение типа signed (или unsigned) long long int.
Подавление ввода
scanf() может прочитать поле, но не присваивать прочитанное значение никакой переменной; для этого надо перед литерой-спецификатором формата поля поставить звездочку, *. Например, когда выполняется оператор
можно ввести пару координат 10,10. Запятая будет прочитана правильно, но ничему не будет присвоена. Подавление присвоения особенно полезно тогда, когда нужно обработать только часть того, что вводится.
Источник: sites.google.com