Операции со строками

Ввод символьных массивов

Описание символьных массивов

Символьные массивы

Лекция 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);