Лекция 7. Символы и строки в языке С++
До сих пор мы работали только с числовыми данными, как целыми, так и действительными. Но, как правило (если речь идет не о сугубо научных расчетах) приходится оперировать с текстовой информацией.
Символьный тип char
Любой текст состоит из символов. Вопрос: что такое символ? Символ – это некоторый значок, изображение. Как и любой значок, в зависимости от особенностей конкретного человек, символ можно написать по-разному. Таким образом и в компьютере, разные символы (в зависимости от шрифта, размера, стиля) могут иметь одно и то же значение. Верно и обратное, буква “A” и “А”, несмотря на то, что выглядят абсолютно одинаково, являются разными буквами, соответственно русского и латинского алфавитов.
Отсюда можно сделать простой вывод, а именно, что способ хранения текстовой информации в компьютере не связан напрямую с изображением этого текста. Вместо символов хранятся их номера – некоторое числовые коды. И в зависимости от интерпретации числовых кодов будут по-разному выглядеть одни и те же символы.
Логичным шагом является стандартизация обозначений некоторых символов цифровыми константами. Изначально было обговорено, что один символ - это 8 бит информации. Таким образом можно было закодировать 256 различных символов. Этого оказалось вполне достаточно для того, что записать все символы латинского алфавита, цифры, знаки препинания, другие специфические символы. Стандарт, который указывает, какие числовые коды соответствуют каким основным символам называется ASCII. В таблицу ASCII входят символы с кодами от 0 до 127. (таблица 7.1.)
Таблица 7.1. ASCII.
При этом символы с кодами, меньшими 32 - это специальные управляющие символы, которые не отображаются на экране. Например, для того, чтобы обозначить конец строки в системе Linux используется один символ с кодом 10, а в системе Windows - два подряд идущих символа с кодами 13 и 10, символы с кодами 48-57 соответствуют начертанию арабских цифр (обратите внимание, символ с кодом 0 - это вовсе не символ, отображающийся на экране, как “0”), символы с кодами 65-90 - заглавные буквы латинского алфавита, а если к их кодам прибавить 32, то получатся строчные буквы латинского алфавита. В промежутках между указанными диапазонами находятся знаки препинания, математические операции и прочие символы.
Важно заметить, в ASCII-таблицы нет русских букв! А также нет букв сотен других национальных алфавитов. Первоначально для отображения букв национальных алфавитов использовали вторую половину возможного значения байта, то есть символы с кодами от 128 до 255. Это приводило к множеству проблем, например, поскольку 128 значений явно недостаточно для того, чтобы отобразить символы всех национальных алфавитов (даже недостаточно для того, чтобы отобразить символы одного алфавита, например, китайской письменности. Поэтому в настоящее время для кодирования символов используется стандарт Unicode, последняя версия 5.2 которого (октябрь, 2009) включает 107361 различный символ. Естественно, для кодирования Unicode-символов недостаточно одного байта на символ, поэтому используются многобайтовые кодировки (для представления одного символа необходимо несколько байт).
Отсюда следуют постоянны ошибки с выводом русского текста на экран. Поэтому, работа с русскими строками не используется в олимпиадах вообще.
В языке C++ для хранения однобайтового символа используется тип данных char. Переменную типа char можно рассматривать двояко: как целое число, занимающее 1 байт и способное принимать значения от -128 до 127 (тип signed char, есть также беззнаковая модификация unsigned char, принимающая значения от 0 до 255) и как один символ текста. Само по себе определение char может оказаться как знаковым, так и беззнаковым, в зависимости от операционной системы и компилятора. Поэтому использовать тип char не рекомендуется, лучше явно указывать будет ли он знаковым (signed) или беззнаковым (unsigned).