Урок 5. Ввод информации с клавиатуры (scanf)

Всем привет. Сегодня попробуем ввести информацию с клавиатуры и сохранить в переменной. Для этого используется функция scanf из библиотеки stdio.h.

Пример использования функции scanf:

Начнем разбирать каждую строку отдельно, начиная с четвертой.

В четвертой строке мы объявляем переменные a и b типа int, и сразу присваиваем переменной b значение пять.

В пятой строке выводим на экран текст a= с помощью функции printf.

В шестой строке мы используем функцию scanf. Когда программы выполнит пятую строку и перейдет к шестой строке она будет ожидать ввода информации. Рассмотрим поподробнее конструкцию. Сначала мы объявляем саму функцию scanf и открываем скобки, а внутри скобок кавычки.После кавычек ставим запятую, знак & и переменную в которую хотим записать информацию (писать надо слитно — &a). Переменная a у нас десятичная int, поэтому в кавычках пишем спецификатор %d (как для printf, но только в этом случае программа будет не выводить а записывать в переменную) (спецификаторы дле переменных мы рассматривали на третьем уроке). Но с спецификаторами не всегда так. В некоторых случаях приходится использовать так же плюс и модификаторы:

Модификаторы:

  • *h — для ввода значений типа short int (hd);
  • *l — для ввода значений типа long int (ld) или double (lf,le);
  • *L — для ввода значений типа Long double (Lf,Le);

В седьмой строке мы используем printf. Она вам уже хорошо знакома. И здесь мы получаем сумму a и b.

Рассмотрим еще один пример.

Результат выполнения программы:

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

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

Чтобы регулировать количество символов, нужно после знака % — процента указать количество символов, а потом поставить спецификатор.

Источник

Ввод с клавиатуры линукс

Оглавление книги Популярные страницы Скачать книгу Купить книгу

В четвертом издании популярного руководства даны основы программирования в операционной системе Linux. Рассмотрены: использование библиотек C/C++ и стан­дартных средств разработки, организация системных вызовов, файловый ввод/вывод, взаимодействие процессов, программирование средствами командной оболочки, создание графических пользовательских интерфейсов с помощью инструментальных средств GTK+ или Qt, применение сокетов и др. Описана компиляция программ, их компоновка c библиотеками и работа с терминальным вводом/выводом. Даны приемы написания приложений в средах GNOME® и KDE®, хранения данных с использованием СУБД MySQL® и отладки программ. Книга хорошо структурирована, что делает обучение легким и быстрым.

Для начинающих Linux-программистов

Книга: Основы программирования в Linux

Клавиатурный ввод

Разделы на этой странице:

Чтение с клавиатуры — очень простая операция. К основным функциям чтения относятся следующие:

#include <curses.h>
int getch(void);
int getstr(char *string);
int getnstr(char *string, int number_of_characters);
int scanw(char *format, . );

Все они действуют подобно своим аналогам, не входящим в библиотеку curses, getchar , gets и scanf . Обратите внимание на то, что у функции getstr нет возможности ограничить длину возвращаемой строки, поэтому применять ее следует с большой осторожностью. Если ваша версия библиотеки curses поддерживает функцию getnstr , позволяющую ограничить количество считываемых символов, всегда применяйте ее вместо функции getstr . Это очень напоминает поведение функций gets и fgets , с которыми вы познакомились в главе 3.

В упражнении 6.3 для демонстрации управления клавиатурой приведен пример короткой программы ipmode.c.

Упражнение 6.3. Режим клавиатуры и ввод

1. Наберите программу и включите в нее начальные вызовы библиотеки curses:

#include <unistd.h>
#include <stdlib.h>
#include <curses.h>
#include <string.h>
#define PW_LEN 256
#define NAME_LEN 256
int main() <
char name[NAME_LEN];
char password[PW_LEN];
const char *real_password = «xyzzy»;
int i = 0;
initscr();
move(5, 10);
printw(«%s», «Please login:»);
move(7, 10);
printw(«%s», «User name: «);
getstr(name);
move(9, 10);
printw(«%s», «Password: «);
refresh();

2. Когда пользователь вводит свой пароль, необходимо остановить отображение символов на экране. Далее сравните введенный пароль со строкой xyzzy:

cbreak();
noecho();
memset(password, », sizeof(password));
while (i < PW_LEN) <
password[i] = getch();
if (password[i] == ‘n’) break;
move(8, 20 + i);
addch(‘*’);
refresh();
i++;
>

3. В заключение восстановите отображение символов и выведите сообщение об успешном или неудачном завершении:

echo();
nocbreak();
move(11, 10);
if (strncmp(real_password, password, strlen(real_password)) == 0)
printw(«%s», «Correct»);
else printw(«%s», «Wrong»);
printw(«%s», » password»);
refresh();
sleep(2);
endwin();
exit(EXIT_SUCCESS);
>

Источник

9.3.3. Ввод символов с клавиатуры

В процессе ввода символов с клавиатуры можно выделить четыре соответствия или отображения (в математическом смысле этого слова).

1. На клавиатуру нанесены (или наклеены) символы. Это первое соответствие: символ -› клавиша.

2. Микропроцессор клавиатуры реализует второе соответствие: комбинация клавиш -› скан-код.

3. Далее скан-код клавиатуры преобразуется в код символа, понятный приложению, например, ASCII-код или UNICODE; это третье соответствие: скан-код -› код символа, используемый приложением.

Похожее:  Скачать драйвера для ноутбука Dell Computer Corporation Inspiron N5110

4. И, наконец, для изображения символа на экране или принтере используется четвертое соответствие: ASCII-код -› изображение символа.

О наличии этих соответствий полезно помнить при рассмотрении вопросов взаимодействия пользователя с приложениями. А теперь вернемся к вопросу о том, как работает клавиатура.

Управление работой клавиатуры в текстовом режиме осуществляется драйвером терминала, который входит в состав ядра Linux. Драйвер терминала состоит как бы из двух отдельных драйверов: драйвера клавиатуры и драйвера экрана. Драйвер клавиатуры обрабатывает нажатия клавиш пользователем и передает результат прикладной программе, которая, в свою очередь, посылает экранному драйверу символы, которые должны быть отображены на экране.

При каждом нажатии на клавишу микропроцессор клавиатуры генерирует последовательность так называемых скан-кодов, которая представляет собой последовательность из двух или большего числа байтов. Эта последовательность передается драйверу клавиатуры, который может работать в одном из 4 режимов:

K_RAW, когда прикладной программе передается последовательность скан-кодов, сгенерированных клавиатурой. Этот режим используется при работе с приложениями, которые имеют собственный драйвер клавиатуры. Примером такого приложения является система X Window.

K_MEDIUMRAW, когда скан-код клавиши преобразуется в один из 127 возможных кодов, называемых кодами клавиш (keycodes). Каждый код клавиши состоит из кода нажатия клавиши и кода отпускания клавиши. Преобразование скан-кодов в коды клавиш осуществляется в соответствии с внутренней таблицей драйвера клавиатуры. Обычно эта таблица фиксирована, и изменять ее не требуется, хотя в системе существуют команды getkeycodes и setkeycodes, с помощью которых можно просмотреть или изменить некоторые соответствия в этой таблице. Эти команды используются только в том случае, если у вас программируемая клавиатура.

K_XLATE (или режим ASCII), когда код клавиши преобразуется в ASCII-код символа или некоторую последовательность ASCII-кодов символов в соответствии с таблицей раскладки клавиатуры, которая хранится в виде отдельного файла. Например, для Red Hat Linux 5.2 по умолчанию используется файл defkeymap.map в каталоге /usr/lib/kbd/keymaps/i386/qwerty. Команда dumpkeys выводит на экран содержание действующей в данный момент таблицы раскладки клавиатуры, а команда loadkeys загружает в драйвер таблицу раскладки клавиатуры из указанного файла.

K_UNICODE, когда скан-коды преобразуются в двухбайтовые коды таблицы UNICODE (этот режим пока используется очень редко).

Выбор режима работы драйвера терминала определяется прикладной программой, которая в данный момент времени выполняется компьютером. Чаще всего используется третий режим, когда код клавиши либо преобразуется в ASCII-код символа или строку таких кодов в соответствии с таблицей раскладки клавиатуры, либо выполняется действие, определенное для конкретной комбинации клавиш в таблице раскладки клавиатуры. Например, нажатие ‹Ctrl›+‹Alt›+‹Del› эквивалентно вызову команды shutdown -r 0, т. е. приводит к останову системы и перезагрузке компьютера.

Режим работы драйвера клавиатуры можно узнать или изменить с помощью команды kbd_mode. Однако не торопитесь менять режим, так как перевод драйвера клавиатуры в режим RAW или MEDIUMRAW может сделать его недоступным для большинства приложений, т. е. легко можно вообще потерять возможность ввода команд.

Не для всех клавиш и комбинаций клавиш процесс обработки проходит так прямолинейно, как это описано выше. Во-первых, имеется несколько особых клавиш, так называемых клавиш-переключателей. Это клавиши ‹Shift› (левая и правая), ‹Alt› (левая и правая), ‹Ctrl› (левая и правая), ‹Caps Lock›, ‹Num Lock›, ‹Ins›. Нажатие на клавишу-переключатель изменяет значение одного из разрядов (битов) в двухбайтовом слове, которое хранит состояние клавиш-переключателей. Поэтому драйвер клавиатуры вначале должен проанализировать состояние этого слова, а затем соответственно преобразовать коды.

Клавиша ‹Ins› является единственной из клавиш переключателей, нажатие которой не только заносит признак в слово состояния переключателей, но и порождает передачу соответствующего кода драйверу терминала.

С помощью ASCII-кодов можно представить 256 различных символов, а, значит, ASCII-коды можно сопоставить 256-ти кодам клавиш. Учитывая наличие клавиш переключателей, комбинаций клавиш существует гораздо больше. Поэтому некоторые комбинации клавиш драйвер клавиатуры преобразует в цепочки из нескольких байтов, так называемые Escape-последовательности, в которых два первых байта служат признаком Escape-последовательности, а последующие представляют собой собственно значащие байты. Escape-последовательности обычно представляют те комбинации клавиш, которые используются для управления работой программ, таких как стрелки, клавиши ‹Page Down›, ‹Page Up›, ‹Home›, ‹End›, ‹F1› — ‹F12›, ‹Ins›, ‹Del› и т. д.

В комплект Red Hat Linux входит программа showkey, которая показывает все три вида кодов, связанных с нажатиями клавиш. Если запустить эту программу с параметром -s, она будет показывать скан-коды нажатий клавиш (чтобы выйти из программы, надо просто выждать 10 секунд, не нажимая в это время ни одной клавиши). Ввод команды showkey -k приводит к выводу на экран кодов клавиш (выходим так же). Ввод команды showkey -m позволяет просмотреть ASCII-коды, которые выдаются драйвером клавиатуры после того, как скан-код клавиши будет оттранслирован с помощью таблицы раскладки клавиатуры. Попробуйте в этом режиме нажать ‹Ctrl›+‹=› или ‹Ctrl›+‹Esc›, и вы увидите, что не каждая комбинация клавиш порождает ASCII-код (попробуйте также клавиши-переключатели). В новых версиях программы showkey появилась опция -u, при которой отображаются коды UNICODE.

Похожее:  Клавиатура для шрифта брайля

Примечания:

Если вы уже перешли в графический режим, то программа showkey может работать некорректно, о чем она вежливо сообщает при запуске. Обратите внимание на эти сообщения! Кстати, showkey неправильно работает не только в графическом режиме, но и при подключении через telnet и т.п.

Поскольку чаще всего используется режим преобразования в ASCII-коды, например, при работе в текстовом режиме и в эмуляторе терминала, таблица раскладки клавиатуры имеет такое большое значение. Возможно, вас не устраивает та раскладка, которая используется по умолчанию. Давайте рассмотрим, как ее поменять.

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

9.3.3. Ввод символов с клавиатуры

9.3.3. Ввод символов с клавиатуры В процессе ввода символов с клавиатуры можно выделить четыре соответствия или отображения (в математическом смысле этого слова). 1. На клавиатуру нанесены (или наклеены) символы. Это первое соответствие: символ -› клавиша. 2. Микропроцессор

1.2.3. Настройка раскладки клавиатуры

1.2.3. Настройка раскладки клавиатуры При установке системы мы выбрали русскую раскладку клавиатуры. После установки системы Будут доступны две раскладки — русская и английская. Для переключения между ними используется комбинация клавиш ‹Shift+Shift› (т.е. вам нужно

Раскладка клавиатуры

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

Настройка клавиатуры

Настройка клавиатуры Чтобы перейти к настройкам клавиатуры, нужно на ее значке (см. рис. 2.7) щелкнуть правой кнопкой мыши и в открывшемся контекстном меню выбрать пункт Параметры клавиатуры. В результате на экране отобразится окно, изображенное на рис. 2.11. Рис. 2.11.

Ввод с клавиатуры

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

Шутка №3 — отключение клавиатуры

Шутка №3 — отключение клавиатуры Используя функцию для отключения мыши, можно написать код для отключения клавиатуры. Напишите такой код для третьей шутки:SystemParametersInfo(SPI_SETFASTTASKSWITCH, 1, @Dummy, 0);SystemParametersInfo(SPI_SCREENSAVERRUNNING, 1, @Dummy, 0);OldKbHook:= SetWindowsHookEx(WH_KEYBOARD, @KbHook, HInstance, 0);Здесь

Ответ на события клавиатуры

Ответ на события клавиатуры Обработка ввода с клавиатуры почти идентична обработке событий мыши. cобытия KeyUp и KeyDown работают в паре с делегатом KeyEventHandler, который может указывать на любой метод, получающий объект общего вида в качестве первого параметра, и KeyEventArgs – в

IV. Виртуальные клавиатуры

IV. Виртуальные клавиатуры IV.1. Виды виртуальных клавиатурИногда требуется в текст документа (корректура, правка после OCR) ввести Unicode символы. Удобнее для этого использовать соответствующие виртуальные клавиатуры:1. Различные символы (стрелки, ноты…): 2. Математическая: 3.

Определение класса символов и преобразование символов

Определение класса символов и преобразование символов Функция Краткое описание isalnum проверка на букву или цифру isalpha проверка на букву isascii проверка на символ из набора кодировки ASCII iscntrl проверка на управляющий символ isdigit проверка на десятичную

Ввод с клавиатуры

Ввод с клавиатуры SetKeyboardState Функция SetKeyboardState копирует массив из 256 байт состояний клавиш в таблицу состояния ввода с клавиатуры вызывающего потока. Это та же самая таблица, к которой имеют доступ функции GetKeyboardState и GetKeyState . Изменения, сделанные в этой таблице, не влияют на

Ввод с клавиатуры

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

Урок 23. Ввод команд с клавиатуры

Урок 23. Ввод команд с клавиатуры В предыдущем примере каждой части клипа соответствовала одна из пяти кнопок. Хотя основным средством управления во Flash-роликах являются кнопки, иногда в играх используется и прямой ввод с клавиатуры.Существует два способа ввода с

Ввод специальных символов

Ввод специальных символов Если возникнет необходимость ввести символы, которых нет на клавиатуре, например знаки градуса, диаметра, символы греческого алфавита и т. п., то можно сделать это, используя кнопку Insert Symbol (Вставить символ) – третью по счету кнопку в левом

Профилактика клавиатуры

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

Источник

Как работает ввод текста в терминале linux?

Всем привет, кто нибудь может объяснить хотя бы примерно, как работает ввод текста в терминале с клавиатуры?

Не получается нагуглить подобное да и не знаю даже как правильно сформулировать запрос. В общем, что именно в линуксе занимается считыванием данных с клавиатуры и отображением их в терминале? Командные оболочки такие как bash и sh насколько я знаю этим не занимаются. Они лишь принимают ввод из stdin и выполняют команды.

Похожее:  Клавиатура для планшета Asus TF101 EP101 с корпусом топкейс RU 90R OK061KD8000Y

Допустим я написал какую-то программу на С и там прописал что-то типа fgets(buffer, 20, stdin);

И когда я выполняю эту программу, то на этой строчке терминал переходит в режим считывания данных с клавиатуры. Но как это работает не понятно. В stdin может быть как файл так и данные с клавиатуры. Это как-то на уровне ядра происходит? Где система проверяет если stdin это файл, то просто считать данные из файла, а если это какое-то устройство типа клавиатуры, то запустить какой нить процесс считывания с клавиатуры. Помогите плиз.

В stdin может быть как файл так и данные с клавиатуры. Это как-то на уровне ядра происходит?

Процесс назначения stdin и stdout для конкретной программы не является «одноступенчатым». На самом деле, события развиваются как-то так:

  1. Вы подходите к терминалу (их может быть много разных) и вводите логин/пароль.
  2. Демон логина проверяет Ваши права и (если всё ОК) сообщает ядру о входе пользователя с Вашим конкретным ID.
  3. Ядро, по ID ищет в файле /etc/passwd информацию о Вас.
  4. Найдя эту инфу, ядро устанавливает заданный для Вас текущий каталог и запускает тот варианта shell, который указан в Ваших данных. При запуске shell ему передаётся имя устройства /dev/tty. с которого вы залогинились.

Это устройство становится stdin и stdout для Вашего экземпляра shell. Первая часть назначения завершена. Дальше события развиваются следующим образом:

  1. shell печатает на stdout приглашение ввода — промпт.
  2. Вы печатает нечто вроде my_prog и нажимаете Enter.
  3. shell считывает имя программы, и выполняет системные вызовы fork и execve.
  4. Ядро выделяем память для процесса и копирует(. ) туда всё программное окружение, включая (!) дескрипторы файлов stdin и stdout

Таким образом, Ваше приложение наследует в качестве стандартных устройств ввода/вывода тот самый терминал, с которого Вы залогинились. Но, возможно, что Ваша команда имеет вид:

Тогда shell, выполняя запуск Вашего приложения, проверит существование my_stdin.txt, откроет этот файл на чтение и передаст дескриптор этого уже открытого файла Вашему приложению на месте stdin.

Ваше приложение может выяснить, откуда оно выполняет ввод, с помощью системных вызовов как-то так:

Сам процесс ввода/выода для stdin выполняется драйвером соответствующего типа: терминала, дисковой файловой системы, СОМ-порта и т.д. Именно там выполняется необходимое буферирование, копирование и всё остальное. Прикладная программа имеет полное право совсем не знать, откуда идёт ввод.

Источник



Как вводить специальные символы в Linux?

в windows есть возможность вводить с клавиатуры специальные знаки, удерживая клавишу alt и набрав несколько цифр, что зависит от знака, который вы хотите использовать. Работает ли он с linux таким же образом?

5 ответов

можно использовать Ctrl + Shift + u затем код hex. (Вам нужно только удерживать Ctrl и Shift при вводе кода)

X использует то, что называется compose ключ. Нажав Compose , какой-то ключ , какой-то ключ . в последовательности можно вводить символы. У меня ключ compose установлен в Menu ; тип © (символ авторского права), я хотел бы использовать Menu , o , c .

полный список комбинаций клавиш X compose можно найти онлайн (200 кб), или локально в /usr/share/X11/locale/en_US.UTF-8/Compose .

в Gnome, клавиша compose может быть установлена, перейдя в настройки → Клавиатура → вкладка макеты → параметры макета → положение клавиши Compose.

ввод символов Юникода в Linux варьируется. The UTF-8 и Unicode FAQ есть раздел, содержащий различные методы ввода:

  • Ctrl + Shift + U [unicode in hex] определена в ISO 14755 и реализован GTK2+, и работает в GNOME-Terminal и других приложениях.
  • Ctrl + V u [unicode in hex] работает в ЭНЕРГИЯ.
  • Alt + [unicode in decimal using numpad digits] работает в консоли при условии, что ваша среда правильно настроена на ожидание UTF-8 (через переменные окружения LOCALE или LANG). (unicode_start manpage).

другие методы вы могли бы использовать:

  • вырезать-N-вставить символы из небольшого входного файла, содержащего нужные символы.
  • использовать xmodmap для переназначения ключей в X (см. ссылку FAQ выше образцы.)

консоль Linux также поддерживает клавиши compose (клавиша compose часто Alt + AltGr или PrintScrn ) — см. как определить ключ Compose в терминале на Unix и Linux Stack Exchange для деталей.

существует лучший метод для Linux и Windows, чем использование кодов alt-клавиш, которые не требуют запоминания каких-либо кодов. Это подробно описано здесь.

суть в том, что вы используете AutoHotKey (Windows) или AutoKey (Linux). Оба работают в фоновом режиме и принимают произвольные строки в качестве триггера для запуска команды, которая в этом случае должна отправить специальный символ в буфер обмена, а затем вставить его в любую программу в настоящее время используемый.

данный пример имеет / delta в качестве триггера (включая косую черту). После ввода этих шести символов, они удаляются и заменяются δ.

Источник