Операции со строками
Ввод символьных массивов
Описание символьных массивов
Символьные массивы
Лекция 13
Символьный массив – это совокупность символов.
Синтаксис описания символьных массивов следующий:
char имя массива[размер]; |
Пример: char а [15];
В символьных массивах так же, как и в числовых допускаются операции над их отдельными элементами: a[0]=’E’; a[1]= ‘P’; a[2]= ‘9’; a[3]=’ >’; В результате этих операций присваивания в первых четырех ячейках массива будут размещены символы:
Е | Р | > |
В соответствии со стандартом ASCII (American Standard Code for Information Interchange) каждый символ имеет свой числовой код. Символы а и А имеют различные числовые коды, поэтому они воспринимаются как различные символы. Символ 9 воспринимается не как число, а как символ.
Символьные массивы можно вводить путем инициализации при описании. Синтаксис:
сhar имя массива[размер]={‘c1’,’c2’,’c3’, …, ‘cn’}; |
Здесь с1, с2, с3, …, cn – символы, из которых состоит массив.
Можно инициализировать символьный массив по–другому:
сhar имя массива[размер]={“символы”}; |
Например: сhar В[10]={“ЭАПУ2008”};
В этом случае компилятор автоматически добавляет в конце строки null,означающее число 0. null является признаком окончания строки. Последовательность символов, заключенная в кавычки называется строкой. Строка всегда заканчивающаяся нулем. В приведенном примере под символьный массив ЭАПУ2008 фактически будет использовано не восемь (по количеству символов), а девять позиций. Девятую позицию будет занимать символ признака окончания строки 0.
Можно инициализировать символьный массив без указания размера массива. Например:
char name[ ] = “Ivanov”;
Здесь не указан размер массива (квадратные скобки пустые). Он устанавливается по факту плюс позиция под знак признака окончания строки. В приведенном примере это соответствует семи позициям. Такая форма инициализации удобна тем, что избавляет от необходимости подсчитывать количество позиций для массива.
В отличие от числовых переменных строки нельзя сравнивать и применять к ним операцию присваивания. Например, пусть описаны два следующих символьных массива:
char A[ ]= “ЭАПУ2008а”;
char B[ ]= “ЭАПУ2008б”;
Операция А = В в этом случае не будет выполняться даже, несмотря на то, что размеры этих массивов одинаковы.
В языке С++ имеются специальные функции для работы с символьными (строковыми) массивами. Все они содержаться в стандартной библиотеке языка С++, в заголовочном файле string.h и stdlib.h. Ниже приводятся часто употребляемые функции из этой группы.
Функцияsizeof ( )
Функция sizeof ( ) определяет размер массива. Оператор вызова этой функции устанавливает размер описанного массива в виде целого числа. Использование этой функции очевидно для случая описания массива в виде:
char S[ ]= “Результаты вычисления токов в разветвляющихся цепях”;
Определить количество символов в этом массиве можно, но это утомительно и иногда может привести к ошибке.
Другую причину применения этой функции можно увидеть, например, при отладке программы, когда первоначальный размер массива, например, 40 в окончательной версии будет иметь 50. Это означает, что во всех местах программы, где используется размер массива, следует вносить изменения. Например:
char MS[40];
. . . . . . . . . . . .
for (i= 0; i < 40; i ++)
. . . . . . . . . . . . . . . . . . .
Если этот фрагмент программы заменить следующим, то легко можно избежать уже вышеупомянутых осложнений.
char MS[40];
. . . . . . . . . . . .
for (i= 0; i < sizeof(MS); i ++)
. . . . . . . . . . . . . . . . . . .
Функция strlen( )
Эта функция определяет длину строки (без учета символа null). Например:
char S1[50]=”Характеристики электродвигателей”;
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
cout << strlen(S1);
На экран будет выведено число 32. Пробел также так же кодируется, как и другие символы, и учитывается как символ. Размер строки 32 и размер массива 50, как видно, не одно и то же. 50 – это предельный размер массива. Длина строки может принимать различные размеры, но не превышать размер массива. Для указанного размера массива 50 предельная длина строки составит 49 (плюс символ null).
Функцияstrcmp( )
Эта функция посимвольно сравнивает две строки в соответствии с алфавитом и учетом регистра, то есть различает строчные и прописные буквы (А и а). Сравнение ведется до первой пары неодинаковых символов. После этого процесс сравнения прекращается и делается заключение о сравниваемых строках по результату сравнения неодинаковых символов пары, на которой прекратился процесс сравнения. Дальнейшие символы уже не рассматриваются. Не следует путать сравнение длин строк и посимвольное сравнение. Например, сравниваются две строки:
char S1[ ]= “abcd”;
char S2[ ]= “abdc”;
strcmp( S1, S2);
Результатом сравнения будет то, что строка S1 меньше строки S2. При по–парном сравнении символов обнаружится их различие в третьей паре: c и d. Код символа с меньше, чем код символа d, поскольку с стоит в алфавите раньше, чем d.
При сравнении строк возможны три варианта результата:
– если строки S1= S2, то функция возвращает в качестве результата число 0;
– если S1 < S2, то результатом будет отрицательное целое число;
– если S1 > S2, то результатом будет положительное целое число.
Функция stricm( )
Эта функция сравнивает две строки посимвольно в соответствии с алфавитом, но без учета регистров символов. Здесь символы а и А воспринимаются одинаковыми. Процесс сравнения аналогичен тому, какой и в функции strcmp( ) и форма представления результата та же. Пример вызова функции:
stricm ( S1, S2);
Функция strcpy( )
Это функция позволяет копировать одну строку в другую. При этом необходимо соблюдать следующее условие: строка, которая копируется должна быть меньшей или равной той строке, в которую совершается копирование. Это объясняется тем, что строку меньшего размера всегда можно поместить в строке большего размера. В противном случае возникает ошибка. Пример:
char S1[ ] =”Ivanov”;
char S2[ ] =”Sidorov”;
. . . . . . . . . . . . . . . . . . .
strcpy(S2, S1 );
В скобках функции strcpy( ) в качестве первого аргумента должна записываться строка, куда осуществляется копирование (S2), а строка, которая копируется (S1), записывается на втором месте. В результате содержание строки S2 удаляется, и на его месте помещается значение строки S1. То есть будет:
S1[ ] =”Ivanov”;
S2[ ] =”Ivanov”;
Копирование строки S2 (Sidorov) в строку S1 (Ivanov) приведет к ошибке, так как S2 > S1.
Следить за размерами строк – обязанность программиста.
Функцияstrcat ( )
Эта функция подсоединяет одну строку к другой. Операция подсоединения строк называется конкетацией.
Пример:
char S1[ ] =”abcd”;
char S2[ ] =”klm”;
. . . . . . . . . . . . . . . . . . .
strcat(S1, S2 );
Здесь S1 – строка, к которой подсоединяется, а S2 – строка, которая подсоединяется. В результате работы функции к первой строке подсоединяется вторая и получается новое содержание строки S1 – abcdklm.
Функцияatoi ( )
Эта функция преобразовывает символьный массив в целое число. Как известно каждая цифра (0, 1, 2, 3, 4, 5, 6, 7, 8, 9) может быть представлена символом. Поэтому любое число, хранящееся в компьютере, быть представлено набором символов и наоборот. Функция atoi ( ) как раз и преобразовывает символьный массив в число. Если массив состоит не из цифр, то функция возвращает ноль.
Синтаксис функции:
int atoi (char S[ ]);
Например:
cout << atoi(S);
Функцияatof ( )
Эта функция преобразовывает символьный массив в вещественное число с плавающей точкой.
Синтаксис функции:
float atof (char S[ ]);
Функцияitoa ( )
Эта функция преобразовывает целое число в символьный массив.
Синтаксис фнкции:
itoa (int m, char S[ ], int dec);