Символы, строки
Базовый тип данных char в С/С++ понимается двояко: как байт - минимальная адресуемая единица представления данных в компьютере, и как символ текста. Такая двоякость возникает в результате установления соответствия в компьютерах между символами и присвоенными им значениями целой переменной (кодами). Любое устройство, отображающее символьные данные, при получении любого кода выводит соответствующий ему символ. Аналогично клавиатура (совместно с драйвером) кодирует нажатие любой клавиши с учетом регистровых и управляющих клавиш в соответствующий ей код.
Например:
-
Сивол
Код
Сивол
Код
' '
0x20
'B'
0x42
'*'
0x2A
'Y'
0x59
'0'
0x30
'Z'
0x5A
'1'
0x31
'a'
0x61
'9'
0x39
'b'
0x62
'A'
0x41
'z'
0x7A
Тип данных char не имеет никаких ограничений на выполнение операций, допустимых для целых переменных: от операций сравнения и присваивания до арифметических операций и операций с отдельными битами.
Для представления отдельных символов можно пользоваться символьными (литерными) константами, которые представляют собой символ, заключенный в одинарные кавычки (апострофы). Транслятор вместо такой константы всегда подставляет код соответствующего символа, например:
char c;
for (c= 'A'; c <= 'Z'; c++) ...
for (c=0x41; c <=0x5A; c++) ...
Существует ряд кодов так называемых неотображаемых символов, которым соответствуют определенные действия при вводе-выводе символьных данных. Например, символу с кодом 0x0D ("возврат каретки") соответствует перевод курсора в начало строки. Для их представления в программе используются символьные константы, начинающиеся с обратной косой черты:
Константа |
Код |
Название |
Действие |
\a |
0x07 |
bel |
Звуковой сигнал |
\b |
0x08 |
bs (backspase) |
Курсор на одну позицию назад |
\f |
0x0C |
ff (form feed) перевод формата |
Переход к началу следующей страницы |
\n |
0x0A |
lf (line feed) перевод строки |
Переход на одну строку вниз |
\r |
0x0D |
cr (carriage return) возврат каретки |
Возврат на первую позицию строки |
\t |
0x09 |
ht (horizontal tab) |
Переход к позиции в строке кратной 8 (табуляция) |
\v |
0x0B |
vt (vertical tab) |
Вертикальная табуляция по строкам |
\\ \' \" \? |
|
|
Представление символов \, ', ", ? |
\OOO |
|
|
Символ с восмеричным кодом ООО |
\xHH |
|
|
Символ с шестнадцатеричным кодом HH |
\0 |
|
|
Символ с кодом 0 |
Некоторые программы и стандартные функции обработки символов и строк (isdigit, isalpha) используют факт, что цифры, прописные и строчные (маленькие и большие) латинские буквы упорядочены по возрастанию значений кодов:
'0' - '9' 0x30 - 0x39
'A' - 'Z' 0x41 - 0x5A
'a' - 'z' 0x61 - 0x7A
Рассмотрим фрагменты, использующие эти особенности кодирования.
Получить символ десятичной цифры из значения целой переменной, лежащей в диапазоне 0..9:
int n;
char c;
c = n + '0';
Получить символ шестнадцатеричной цифры из значения целой переменной, лежащей в диапазоне 0..15:
if (n <=9) c = n + '0';
else c = n - 10 + 'A';
Получить значение целой переменной из символа десятичной цифры:
if (c >='0' && c <='9') n = c - '0';
Получить значение целой переменной из шестнадцатеричной цифры:
if (c >='0' && c <='9') n = c - '0';
else
if (c >='A' && c <='F') c = c - 'A' + 10;
Преобразовать маленькую латинскую букву в большую:
if (c >='a' && c <='z') c = c - 'a' + 'A';
Строкой называется последовательность символов, ограниченная символом с кодом 0, то есть '\0'. Из ее определения видно, что она является объектом переменной размерности. Поскольку в Си допускаются переменные только фиксированной размерности, то единственным допустимым способом представления строки является массив символов.
Строка хранится в массиве символов, массив символов может быть инициализирован строкой, а может быть заполнен программно:
char str[20] = { 'С','т','р','о','к','а','\0' };
char str[] = “Строка”;
char *str= “Строка”;
int i;
char str[80];
for (i=0; i<20; i++) str[i] = 'A';
str[20] = '\0';
Cтрока имеет переменную размерность, ограниченную символом '\0', поэтому работать с ней можно, просматривая ее от начала до конца, пока не встретится символ '\0':
for (i=0; str[i] !='\0'; i++)...
Соответствие размерности массива и длины строки транслятором не контролируется:
char s[20];
// необходимо следить за переполнением массива
// и ограничить строку его размерностью
for (i=0; i<19 && B[i]!='\0'; i++)
s[i] = B[i];
s[i]='\0';
Строковой константой называется последовательность символов, заключенная в двойные кавычки. Допустимо использование неотображаемых символов. Строковая константа автоматически дополняется символом '\0', ею можно инициализироваться массив, в том числе такой, размерность которого определяется размерностью строки:
char A[80] = "123456\r\n";
char B[] = "aaaaa\033bbbb";
..."Это строка"...