Символы и C-строки

В языке C++ доступны два типа строк: C-строка и L-строка. C-строка является массивом однобайтовых символов (тип char), последний элемент которого содержит нулевой символ ('\0'). Обратите внимание на то, что нулевой символ (нулевой байт) не имеет никакого отношения к символу '0'. Коды этих символов разные. L-строка является массивом широких символов (тип wchar_t), последний элемент которого содержит нулевой символ. Кроме того, в языке C++ можно воспользоваться двумя классами — string и wstring, которые предоставляют более удобный интерфейс доступа, избавляющий программиста от необходимости следить за размером символьного массива (см. главу 9).

Объявление и инициализация отдельного символа

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

char ch1, ch2;
ch1 = 119; // Буква w
ch2 = 'w'; // Буква w
// Выводим символ
std::cout << ch1 << std::endl;                   // w
std::cout << ch2 << std::endl;                   // w
// Выводим код символа
std::cout << static_cast<int>(ch1) << std::endl; // 119
std::cout << static_cast<int>(ch2) << std::endl; // 119

Внутри апострофов можно указать специальные символы — комбинации знаков, обозначающих служебные или непечатаемые символы. Перечислим специальные символы, доступные в языке C++:

  • \0 — нулевой символ;
  • \n — перевод строки;
  • \r — возврат каретки;
  • \t — горизонтальная табуляция;
  • \v — вертикальная табуляция;
  • \a — звуковой сигнал;
  • \b — возврат на один символ;
  • \f — перевод формата;
  • \' — апостроф;
  • \" — кавычка;
  • \? — знак вопроса;
  • \\ — обратная косая черта;
  • \N — восьмеричное значение N;
  • \xN — шестнадцатеричное значение N.

Пример указания восьмеричного и шестнадцатеричного значений:

char ch1, ch2;
ch1 = '\167';                  // Восьмеричное значение
ch2 = '\x77';                  // Шестнадцатеричное значение
std::cout << ch1 << std::endl; // w
std::cout << ch2 << std::endl; // w

По умолчанию тип char является знаковым и позволяет хранить диапазон значений от -128 до 127. Если перед типом указано ключевое слово unsigned, то диапазон будет от 0 до 255. Когда переменной присваивается символ внутри апострофов, он автоматически преобразуется в соответствующий целочисленный код. Пример вывода размера и диапазона значений:

// Выводим размер в байтах
std::cout << sizeof(char) << std::endl;          // 1
// #include <limits.h>
std::cout << CHAR_MIN << std::endl;              // -128
std::cout << CHAR_MAX << std::endl;              // 127
std::cout << UCHAR_MAX << std::endl;             // 255
std::cout << CHAR_BIT << std::endl;              // 8
// #include <limits>
char min = std::numeric_limits<char>::min();
char max = std::numeric_limits<char>::max();
std::cout << static_cast<int>(min) << std::endl; // -128
std::cout << static_cast<int>(max) << std::endl; // 127

Тип char занимает в памяти один байт (восемь бит). Если тип является знаковым, то старший бит содержит признак знака: 0 соответствует положительному числу, а 1 — отрицательному. Если тип является беззнаковым, то признак знака не используется. Это следует учитывать при преобразовании знакового типа в беззнаковый, так как старший бит станет причиной больших значений:

char ch1 = -1;
unsigned char ch2 = static_cast<unsigned char>(ch1);
std::cout << static_cast<int>(ch2) << std::endl;    // 255

Символы, имеющие код меньше 128 (занимают 7 бит), соответствуют кодировке ASCII. Коды этих символов одинаковы практически во всех однобайтовых кодировках. В состав кодировки ASCII входят цифры, буквы латинского алфавита, знаки препинания и некоторые служебные символы (например, перенос строки, табуляция и т. д.). Коды основных символов в кодировке ASCII в десятичном (dec), восьмеричном (oct) и шестнадцатеричном (hex) виде приведены в табл. 7.1.

Восьмой бит предназначен для кодирования символов национальных алфавитов. У типа char эти символы имеют отрицательные значения (старший бит содержит признак знака). Таким образом тип char позволяет закодировать всего 256 символов.

Для кодирования букв русского языка предназначено пять кодировок — windows-1251 (cp1251), windows-866 (cp866), iso8859-5, koi8-r и mac-cyrillic. Проблема заключается в том, что код одной и той же русской буквы в этих кодировках может быть разным. Из-за этого возникает множество проблем. Например, при выводе русских букв в консоли может отобразиться нечитаемый текст. Причина искажения русских букв заключается в том, что по умолчанию в окне консоли используется кодировка cp866. Коды русских букв и некоторых символов в кодировках cp866 и cp1251 в десятичном (unsigned и signed), восьмеричном (oct) и шестнадцатеричном (hex) виде приведены в табл. 7.2. Обратите внимание на то, что коды букв «ё» и «Ё» выпадают из последовательности кодов, поэтому при использовании, например, регулярных выражений буква "ё" не попадает в диапазон [а-я], ее необходимо указывать дополнительно [а-яё].

Учебник C++ (MinGW-W64)
Учебник C++ (MinGW-W64) в формате PDF

Помощь сайту

ЮMoney (Yandex-деньги): 410011140483022

ПАО Сбербанк:
Счет: 40817810855006152256
Реквизиты банка:
Наименование: СЕВЕРО-ЗАПАДНЫЙ БАНК ПАО СБЕРБАНК
Корреспондентский счет: 30101810500000000653
БИК: 044030653
КПП: 784243001
ОКПО: 09171401
ОКОНХ: 96130
Скриншот реквизитов