Читання і запис символів

Найпростішими з консольних функцій введення / виводу є getchar (). яка Новомосковскет символ з клавіатури, і putchar (). яка відображає символ на екрані. Перша з цих функцій очікує, поки Ви не натиснете, а потім повертає значення цієї клавіші. Крім того, при натисканні клавіші на клавіатурі на екрані дисплея автоматично відображається відповідний символ. Друга ж функція, putchar (). відображає символ на екрані в поточній позиції курсору. Ось прототипи функцій getchar () і putchar ().

Як видно з прототипу, вважається, що функція getchar () повертає цілий результат. Однак повертається значення можна привласнити змінної типу char. що зазвичай і робиться, так як символ міститься в молодшому байті. (Старший байт при цьому зазвичай обнулений.) У випадку помилки getchar () повертає EOF. (Макрос EOF визначається в і часто дорівнює -1.)

Що ж стосується putchar (). то незважаючи на те, що ця функція оголошена як приймаюча цілий параметр, вона зазвичай викликається з символьним аргументом. Насправді з її аргументу на екран виводиться тільки молодший байт. Функція putchar () повертає записаний символ або, в разі помилки, EOF.

У наступній програмі продемонстровано застосування getchar () і putchar (). У цій програмі з клавіатури вводяться символи, а потім вони відображаються на іншому регістрі. Тобто символи, що вводяться на верхньому регістрі, виводяться на нижньому, а вводяться на нижньому - виводяться на верхньому. Щоб зупинити програму, введіть точку.

(Ця програма не працює, правда, з кириличними символами.)

Труднощі використання getchar ()

Використання getchar () може бути пов'язано з певними труднощами. У багатьох бібліотеках компіляторів ця функція реалізується таким чином, що вона заповнює буфер введення до тих пір, поки Ви не натиснете . Це називається через підрядник буферизованная введенням. Щоб функція getchar () повернула який-небудь символ, необхідно натиснути клавішу . Крім того, ця функція при кожному її виклику вводить тільки по одному символу. Тому збереження в буфері цілого рядка може привести до того, що в черзі на введення залишаться чекати один або кілька символів, а в інтерактивному середовищі це дратує досить сильно. Хоча getchar () і можна використовувати в якості інтерактивної функції, але це робиться рідко. Так що якщо попередня програма веде себе не так, як очікувалося, то ви тепер знаєте, в чому тут справа.

Альтернативи getchar ()

Так як getchar (). наявна в бібліотеці компілятора, може виявитися невідповідною в інтерактивному середовищі, то для читання символів з клавіатури може знадобитися інша функція. У стандарті мови С не визначається ніяких функцій, які гарантували б інтерактивний введення, але їх визначення є буквально в бібліотеках усіх компіляторів С. І нехай в стандарті С ці функції не визначені, але відомі вони всім! А відомі вони завдяки функції getchar (). яка для більшості програмістів явно не підходить.

У двох з найпоширеніших альтернативних функцій getch () і getche () є наступні прототипи:

У бібліотеках більшості компіляторів прототипи таких функцій знаходяться в заголовному файлі . У бібліотеках деяких компіляторів імена цих функцій починаються зі знака підкреслення (_). Наприклад, в Visual C ++ компанії Microsoft вони називаються _getch () і _getche ().

Функція getch () очікує натискання клавіші, після якого вона негайно повертає значення. Причому, символ, введений з клавіатури, на екрані не відображається. Є ще й третя функція getche (). яка хоч і така ж, як getch (). але символ на екрані відображає. І якщо в інтерактивній програмі необхідно прочитати символ з клавіатури, то часто замість getchar () застосовується getche () або getch (). Ось, наприклад, попередня програма, в якій getchar () замінена функцією getch ().

Коли виконується ця версія програми, при кожному натисканні клавіші відповідний символ відразу передається програмі і виводиться на іншому регістрі. А введення в рядку не буферизується. І хоча в кодах в цій книзі функції getch () і getche () більше не зустрічаються, але вони цілком можуть стати в нагоді в тих програмах, які напишете ви.

Тоді: коли писалися ці слова, при використанні компілятора Visual C ++ компанії Microsoft функції _getch () і getch () були несумісні з функціями введення стандартного С, наприклад, з функціями scanf () або gets (). Тому вам доведеться замість стандартних функцій використовувати такі їх спеціальні версії, як cscanf () або cgets (). Щоб отримати більш детальну інформацію, слід вивчити документацію по Visual C ++.