Урок 35. Символьный тип данных. Char

   ⁄ 

 Обновлено 17 Апр 2017

  ⁄   

Хоть char и относится к integer (и, таким образом, следует всем их правилам), работа с char несколько отличается, чем с обычными целочисленными типами. Переменная этого типа занимает 1 байт. Однако, вместо преобразования значения char в целое число, оно интерпретируется как символ ASCII.

ASCII — это Американский Стандартный Код для Обмена Информацией, он определяет специальный способ представления английских символов (+ несколько других) в виде чисел от 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 как целочисленные значения. Не очень хороший способ это сделать — присвоить переменную типа char переменной типа int и вывести int:

Лучший способ – использовать type cast. type cast создает значение одного типа из значения другого типа. Для конвертации между основными типами данных (например, из char в int или наоборот) используется static cast.

Синтаксис static cast выглядит вот так:

static_cast<new_type>(expression)

static_cast принимает значение из expression в качестве входных данных и преобразует его в любой другой из основных типов данных, который вы укажете как new_type (например: int, boolean, char, double).

Пример использования static cast для конвертации переменной типа char в значение типа int:

Результат:

a
97
a

Запомните, static_cast принимает expression в качестве входных данных. Если мы используем переменную в expression — та переменная обрабатывается, чтобы произвести значение, которое затем конвертируется в новый тип. Этот процесс конвертации никак не влияет на саму переменную с её значением! В примере выше, переменная ch остается переменной типа char и имеет свое прежнее значение (что и продемонстрировано на последней строчке вывода).

Также в static cast нет никакой проверки на диапазон значений, так что если вы попытаетесь использовать числа, которые слишком большие или слишком маленькие для конвертируемого типа, то произойдет переполнение.

Более подробно о static cast мы поговорим в отдельных уроках.

Ввод символов

Следующая программа просит пользователя ввести символ. Затем она выводит этот символ и его ASCII код:

Результат:

Input a keyboard character: q
q has ASCII code 113

Обратите внимание, что даже если cin позволит вам ввести несколько символов, переменная ch будет хранить только 1 символ, именно он и помещается в переменную. Остальная часть пользовательского ввода остается во входном буфере, который используется 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 символов, вам не нужно указывать знак (поскольку, переменная типа char как signed, так и unsigned может содержать значения от 0 до 127).

Но если вы используете char для хранения небольших целых чисел, то тогда уже нужно уточнять signed это или unsigned. Переменная char signed может хранить числа от -128 до 127. Переменная же char unsigned имеет диапазон от 0 до 255.

Управляющие символы

В C++ есть некоторые символы, которые имеют особые значения. Это так называемые управляющие символы или escape-последовательность. Они начинаются с ‘\’ (бэкслэш), а затем определенная буква или цифра.

Наиболее распространенным управляющим символов в С++ является ‘\n, который используется как перенос на новую строку:

Результат:

First line
Second line

Другой часто используемый управляющий символ — ‘\t’, который заменяет клавишу TAB, вставляет большой отступ:

Результат:

First part        Second part

А вот таблица всех escape-последовательностей или управляющих символов:

Название Символ Значение
Alert \a Делает предупреждение (звуковой сигнал)
Backspace \b Перемещение курсора на один пробел назад
Formfeed \f Перемещение курсора к следующей логической странице
Newline \n Перемещение курсора на следующую строку
Carriage return \r Перемещение курсора в начало строки
Horizontal tab \t Вставка горизонтального TAB-а
Vertical tab \v Вставка вертикального TAB-а
Single quote \’ Вставка одинарной кавычки (или апостроф)
Double quote \” Вставка двойной кавычки
Backslash \\ Вставка обратной косой черты (бэкслэш)
Question mark \? Вставка знака вопроса
Octal number \(number) Перевод числа из восьмеричной системы в тип char
Hex number \x(number) Перевод числа из шестнадцатеричной системы в тип char

Рассмотрим в коде:

Результат:

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

Newline (\n) против std::endl. Что использовать?

Вы могли заметить, что в последнем примере мы использовали \n для перемещения курсора на следующую строку. Но мы могли бы использовать и std::endl. Какая между ними разница? Сейчас разберемся.

Когда мы используем std::cout, то данные для вывода могут быть помещены в буфер, то есть, std::cout может не отправлять данные на вывод сразу же. Вместо этого он может оставить их при себе на некоторое время. Это делается из соображений производительности.

И ‘\n’, и std::endl оба переместят курсор на следующую строку. Кроме того, std::endl также обеспечит вывод всех данных, которые находятся в очереди, прежде чем продолжить.

Так когда же использовать ‘\n’, а когда std::endl? Ответ:

 используйте std::endl, когда нужно, чтобы ваши данные выводились немедленно (например: при написании записи в файл или при обновлении индикатора процесса). Обратите внимание, что этот вариант может повлечь незначительное снижение производительности, особенно если запись на устройство происходит медленно (например, запись файла на диск).

 используйте ‘\n’ в остальных случаях.

Примечание: В наших уроках мы будем использовать ‘\n’ вместо std::endl, так как для вывода в консоль — это почти всегда лучший выбор.

А как насчет других типов char: 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). Что-то вроде этого не разрешено:

Текст, который находится в двойных кавычках, называется string (например, “Hello, world!”). string (строка) – это набор последовательных символов.

Вы можете использовать литералы string в коде:

Более подробно о string мы поговорим в отдельных уроках.

Оценить статью:

Звёзд: 1Звёзд: 2Звёзд: 3Звёзд: 4Звёзд: 5 (11 оценок, среднее: 4,91 из 5)
Загрузка...
Поделиться в:
Подписаться на обновления:

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *