Урок №38. Символьний тип даних char

  Юрій  | 

  Оновл. 28 Кві 2020  | 

 275

Хоча тип char і відноситься до цілочисельних типів даних (і, таким чином, підкоряється усім їхнім правилам), робота з char дещо відрізняється, ніж зі звичайними цілочисельними типами.

Тип даних char

Змінна типу char займає 1 байт. Однак, замість конвертації значення типу char в ціле число, воно інтерпретується як ASCII-символ.

ASCII (від англ. “American Standard Code for Information Interchange”) — це американський стандартний код для обміну інформацією, який визначає спосіб представлення символів англійської мови (+ декілька інших) у вигляді чисел від 0 до 127. Наприклад: код букви 'а' — 97, код букви 'b' — 98. Символи завжди поміщаються в одинарні лапки.

Таблиця символів ASCII:

Код Символ Код Символ Код Символ Код Символ
0 NUL (null) 32 (space) 64 @ 96 `
1 SOH (start of header) 33 ! 65 A 97 a
2 STX (start of text) 34 66 B 98 b
3 ETX (end of text) 35 # 67 C 99 c
4 EOT (end of transmission) 36 $ 68 D 100 d
5 ENQ (enquiry) 37 % 69 E 101 e
6 ACK (acknowledge) 38 & 70 F 102 f
7 BEL (bell) 39 71 G 103 g
8 BS (backspace) 40 ( 72 H 104 h
9 HT (horizontal tab) 41 ) 73 I 105 i
10 LF (line feed/new line) 42 * 74 J 106 j
11 VT (vertical tab) 43 + 75 K 107 k
12 FF (form feed / new page) 44 , 76 L 108 l
13 CR (carriage return) 45 77 M 109 m
14 SO (shift out) 46 . 78 N 110 n
15 SI (shift in) 47 / 79 O 111 o
16 DLE (data link escape) 48 0 80 P 112 p
17 DC1 (data control 1) 49 1 81 Q 113 q
18 DC2 (data control 2) 50 2 82 R 114 r
19 DC3 (data control 3) 51 3 83 S 115 s
20 DC4 (data control 4) 52 4 84 T 116 t
21 NAK (negative acknowledge) 53 5 85 U 117 u
22 SYN (synchronous idle) 54 6 86 V 118 v
23 ETB (end of transmission block) 55 7 87 W 119 w
24 CAN (cancel) 56 8 88 X 120 x
25 EM (end of medium) 57 9 89 Y 121 y
26 SUB (substitute) 58 : 90 Z 122 z
27 ESC (escape) 59 ; 91 [ 123 {
28 FS (file separator) 60 < 92 \ 124 |
29 GS (group separator) 61 = 93 ] 125 }
30 RS (record separator) 62 > 94 ^ 126 ~
31 US (unit separator) 63 ? 95 _ 127 DEL (delete)

Символи від 0 до 31 в основному використовуються для форматування виводу. Більшість з них вже застаріли.

Символи від 32 до 127 використовуються для виведення. Це літери, цифри, знаки пунктуації, які більшість комп’ютерів використовує для відображення тексту (англійською мовою).

Наступні два стейтменти виконують одне і те ж (присвоюють змінним типу char ціле число 97):

Будьте уважні при використанні фактичних чисел з числами, які використовуються для представлення символів (з таблиці ASCII). Наступні два стейтменти виконують не одне і те ж:

Виведення символів

При виводі змінних типу char, об’єкт cout виводить символи замість цифр:

Результат:

a

Також ви можете виводити літерали типу char напряму:

Результат:

b

Оператор static_cast

Якщо ви хочете вивести символи у вигляді цифр, а не у вигляді букв, то вам потрібно повідомити cout виводити змінні типу char в вигляді цілочисельних значень. Не дуже хороший спосіб це зробити — присвоїти змінній типу int змінну типу char і вивести її:

Результат:

97

Кращим способом є конвертація змінної з одного типу даних в інший за допомогою оператора static_cast.

Синтаксис static_cast виглядає наступним чином:

static_cast<новий_тип_даних>(вираз)

static_cast приймає значення з (вираз) в якості вхідних даних і конвертує його у вказаний вами <новий_тип_даних>.

Приклад використання оператора static_cast для конвертації типу char в тип int:

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

a
97
a

Запам’ятайте, що static_cast приймає (вираз) в якості вхідних даних. Якщо ми використовуємо змінну в (виразі), то ця змінна змінює свій тип тільки в стейтменті з оператором static_cast. Процес конвертації ніяк не впливає на вихідну змінну з її значенням! В наведеному вище прикладі, змінна ch залишається змінною типу char з колишнім значенням, чому є підтвердженням останній стейтмент з cout.

Також в static_cast немає ніякої перевірки діапазону, так що якщо ви спробуєте використовувати числа, які занадто великі або занадто маленькі для конвертованого типу, то відбудеться переповнення.

Введення символів

Наступна програма просить користувача ввести символ. Потім вона виводить цей символ і його ASCII-код:

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

Input a keyboard character: q
q has ASCII code 113

Зверніть увагу, що навіть якщо cin дозволить вам ввести декілька символів, змінна ch буде зберігати тільки перший символ (саме він і розміщується у змінній). Інша частина користувацького введення залишиться у вхідному буфері, який використовує cin і буде доступна для використання наступним викликам cin.

Розглянемо це все на практиці:

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

Input a keyboard character: abcd
a has ASCII code 97
b has ASCII code 98

Розмір, діапазон і знак типу сhar

В С++ для змінних типу char завжди виділяється 1 байт. За замовчуванням, char може бути як signed, так і unsigned (хоча зазвичай signed). Якщо ви використовуєте char для зберігання ASCII-символів, то вам не потрібно вказувати знак змінної (так як і signed, і unsigned можуть містити значення від 0 до 127).

Але якщо ви використовуєте тип char для зберігання невеликих цілих чисел, то тоді слід уточнити знак. Змінна типу char signed може зберігати числа від -128 до 127. Змінна типу char unsigned має діапазон від 0 до 255.

Керуючі символи

У C++ є керуючі символи (або ще “escape-послідовність“). Вони починаються з бекслешу ('\'), а потім іде певна буква чи цифра.

Найбільш поширеним керуючим символом в С++ є '\n', який позначає символ нового рядка:

Результат:

First line
Second line

Ще одним часто використовуваним керуючим символом є '\t', який замінює клавішу TAB, вставляючи великий відступ:

Результат:

First part        Second part

Таблиця всіх керуючих символів в C++:

Назва Символ Значення
Попередження (alert) \a Попередження (звуковий сигнал)
Backspace \b Переміщення курсору на одну позицію назад
formfeed \f Переміщення курсору до наступної логічної сторінки
Символ нового рядка (newline) \n Переміщення курсору на наступний рядок
Повернення каретки (carriage return) \r Переміщення курсору на початок рядка
Горизонтальний таб (horizontal tab) \t Вставка горизонтального TAB-а
Вертикальний таб (vertical tab) \v Вставка вертикального TAB-а
Одинарна лапка \’ Вставка одинарної лапки (або апострофа)
Подвійна лапка \” Вставка подвійної лапки
Бекслеш \\ Вставка бекслешу
Знак питання \? Вставка знаку питання
Вісімкове число \(number) Конвертація числа з вісімкової системи числення в тип char
Шістнадцяткове число \x(number) Конвертація числа з шістнадцяткової системи числення в тип char

Розглянемо приклад в коді:

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

"This is quoted text"
This string contains a single backslash \
6F in hex is char 'o'

Що використовувати: ‘\n’ чи std::endl?

Ви могли помітити, що в останньому прикладі ми використовували '\n' для переміщення курсору на наступний рядок. Але ми могли б використовувати і std::endl. Яка між ними різниця? Зараз розберемося.

При використанні std::cout, дані для виведення можуть поміщатися в буфер, тобто std::cout може не відправляти дані відразу ж на виведення. Замість цього він може залишити їх при собі на деякий час. Це робиться в цілях підвищення продуктивності.

І '\n', і std::endl обидва переносять курсор на наступний рядок. Тільки std::endl ще гарантує, що всі дані з буферу будуть виведені, перед тим, як продовжити.

Так коли ж використовувати '\n', а коли std::endl?

   Використовуйте std::endl, коли потрібно, щоб ваші дані виводилися відразу ж (наприклад, під час запису в файл або при оновленні індикатора стану будь-якого процесу). Зверніть увагу, це може спричинити за собою незначне зниження продуктивності, особливо якщо запис на пристрій відбувається повільно (наприклад, запис файлу на диск).

   Використовуйте '\n' у всіх інших випадках.

Інші символьні типи: wchar_t, char16_t і char32_t

wchar_t слід уникати в більшості випадків (крім тих, коли відбувається взаємодія з Windows API).

Так само, як стандарт ASCII використовує цілі числа для представлення символів англійської мови, так і інші системи кодування використовують цілі числа для представлення символів інших мов. Найбільш відомий стандарт (після ASCII) — Unicode, який має в запасі більше ніж 110 000 цілих чисел для представлення символів різних мов.

Є наступні кодування Unicode:

   UTF-32: вимагає 32 біта для представлення символу.

   UTF-16: вимагає 16 біт для представлення символу.

   UTF-8: вимагає 8 біт для представлення символу.

char16_t і char32_t були додані в C++11 для підтримки 16-бітних і 32-бітних символів Unicode (8-бітні символи і так підтримуються типом char).

Різниця між одинарними і подвійними лапками при використанні з символами

Як ви вже знаєте, символи завжди поміщаються в одинарні лапки (наприклад, 'а', '+' чи '5'). Змінна типу char представляє тільки один символ (наприклад, літеру а, символ + чи число 5). Щось на кшталт наступного не є коректним:

Текст, який знаходиться в подвійних лапках, називається рядком (наприклад, "Hello, world!"). Рядок (тип string) — це набір послідовних символів.

Ви можете використовувати літерали типу string в коді:

Більш детально про string ми поговоримо у відповідному уроці.

Оцінити статтю:

1 Зірка2 Зірки3 Зірки4 Зірки5 Зірок (1 оцінок, середня: 5,00 з 5)
Loading...

Залишити відповідь

Ваш E-mail не буде опублікований. Обов'язкові поля відмічені *