Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
билеты.doc
Скачиваний:
210
Добавлен:
16.04.2015
Размер:
257.54 Кб
Скачать

Билет 9. Представление строк и символов в Си. Операции над ними.

Любой язык программирования содержит средства представления и обработки текстовой информации.

Символы и строки в Си реализованы в соответствии со сложившимися  в 70-годы прошлого века стандартами представления текста. Тогдашний уровень технологии привел к тому, что в качестве единицы представления символа был выбран байт, информационная емкость которого равно 28=256. Это означает, что одновременно в программе можно представить не более 256 различных символов. Этого  хватает для стандартного набора символов и букв латинского алфавита.

Тип char представляет целые числа в диапазоне от -128 до 127. Элементы типа char занимают один байт памяти. Слово "char" является сокращением от character, что в переводе означает "символ". Действительно, традиционно символы представляются их целочисленными кодами, а код символа занимает один байт (см. раздел ). Тем не менее, подчеркнем, что элементы типа char - это именно целые числа, с ними можно выполнять все арифметические операции. С математической точки зрения, элементы типа char - это элементы кольца вычетов m = Z256. Стандарт Си не устанавливает, трактуются ли элементы типа char как знаковые или беззнаковые числа, но большинство Си-компиляторов считают char знаковым типом. Примеры описаний переменных типа char:

char c;

char eof = (-1);

char letterA = 'A';

В последнем случае значение переменной "letterA" инициализируется кодом латинской буквы 'A', т.е. целым числом 65. В Си символьные константы записываются в одинарных апострофах и означают коды соответствующих символов в кодировке ASCII. Рассмотрим следующий пример:

char c = 0;

char d = '0';

Здесь переменная c инициализируется нулевым значением, а переменная d - значением 48, поскольку символ '0' имеет код 48.

В языке Си нет отдельного типа для строк. Работа со строками реализована через массивы. Хотя в других языках програмимирования имеется такой тип данных как string - строки. В Си символьная строка - это одномерный массив типа char, заканчивающийся нулем - нулевым байтом. Символьная константа '\0' определена для нулевого байта. Поэтому, если в массиве должно содержаться N символав, то нужно опеределять массив как массив для N+1 элемента. Например, когда мы говорим, что массив содержит 100 элементов: a[1], a[2], ..., a[99], то это значит, что элемент a[100] содержит ноль. Обычный одномерный массив можно трактовать как строку символов. Язык С допускает строковые константы, хотя в языке и нет специального типа для таких констант. Делается это через массив. Строковая константа - это набор литер. В конце строковой константы не нужно ставить символ '\0'.

Инициализировать строку можно следующим образом:

char array[7] = "Строка";

char s[ ] = {'С', 'т', 'р', 'о', 'к', 'а', '\0'};

(при определении массива с одновременной инициализацией пределы изменения индекса можно не указывать).

Второй способ определения строки - это использование указателя на символ. Определение char *b; задает переменную b, которая может содержать адрес некоторого объекта. Однако в данном случае компилятор не резервирует место для хранения символов и не инициализирует переменную b конкретным значением. Когда компилятор встречает оператор вида b ="IBM PC";, он производит следующие действия. Во-первых, как и в предыдущем случае, он создает в каком-либо месте объектного модуля строку "IBM PC", за которой следует нулевой символ ('\0'). Во-вторых, он присваивает значение начального адреса этой строки (адрес символа 'I') переменной b. Функция printf("%s", b) работает так же, как и в предыдущем случае, осуществляя вывод символов до тех пор, пока не встретится заключительный нуль.

Массив указателей можно инициализировать, т.е. назначать его элементам конкретные адреса некоторых заданных строк при определении.

Для ввода и вывода строк символов помимо scanf( ) и printf() могут использоваться функции gets( ) и puts( ) (их прототипы находятся в файле stdio.h).

Если string - массив символов, то ввести строку с клавиатуры можно так:

gets(string);

(ввод оканчивается нажатием клавиши <Enter>). Вывести строку на экран можно следующим образом:

puts(string);

Отметим также, что для работы со строками существует специальная библиотека функций, прототипы которых находятся в файле string.h.

Наиболее часто используются функции strcpy( ), strcat( ), strlen( ) и strcmp( ).

Копирование строки S2 в строку SI. Строка SI заполняется символами из строки S2, включая символ конца строки ‘\0\ Контроль выхода за пределы массива под строку S1 не осуществляется, это возлагается на программиста. Прототип функции: char* strcpy(char *S1, char *S2), результат — указатель на строку SI. .

Соединение (конкатенация) строк S1 и S2. К концу строки S1, начиная с символа конца строки ‘\0′, копируется строка S2. Строка S2 сохраняется. Длина строки становится равной сумме длин строк S1 и S2, поэтому память, выделенная под S1, должна быть не меньше этой длины. Прототип функции: char* strcat(char SI, const char* S2),возвращаемое значение — указатель на строку SI.

Поиск заданного символа в строке. Имеет две разновидности. Поиск первого вхождения символа. Определяет позицию, в которой встретился заданный символ при последовательном просмотре символов с начала строки. Поиск последнего вхождения. Отличается тем, что просмотр символов идет от конца строки к ее началу. Прототипы функций:

char* strchr(const char *S, int с) и char* strrchr(const char *S, int c),

возвращаемое значение — указатель на найденный символ или NULL, если символ не найден.

Поиск подстроки (образа) S2 в строке SI. Является наиболее широко используемой операцией. Очевидно, что длина L2 подстроки S2 не может быть больше длины LI строкиS1. Прототип функции: char* strstr(const char *Sl,const char *S2). Возвращаемое значение — указатель на первый символ найденной в S1 подстроки.

Сравнение двух строк S1 и S2. Осуществляется посимвольным сравнением строк. Так как длины строк S1 и L2 могут отличаться, то число сравниваемых символов ограничивается значением min(Ll,L2)+l. В этом случае последними сравниваются символ из более длинной строки и нулевой символ ‘\0′, замыкающий короткую строку. Сравнение строк заканчивается, когда будут исчерпаны все сравниваемые символы либо при неравенстве очередной пары символов. Результат операции определяется результатом последнего сравнения:

(Sl[i\ == S2[i\) — равен нулю,

(Sl[i\ < S2[i\) — меньше нуля,

(SI[i] > S2[i\) — больше нуля.

Прототип функции: int strcmp(const char *S1, const char *S2).

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]