Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
lab_C-09(string).doc
Скачиваний:
5
Добавлен:
21.11.2019
Размер:
92.16 Кб
Скачать

Слияние (конкатенация) строк

Одним из способов "склейки" строк является применение библиотечной функции strcat (от string concatenation) со следующим прототипом:

char* strcat(char* dest, char* src) .

Функция дописывает копию строки src в конец строки dest, причем первый символ строки src замещает нуль-терминатор строки dest.

Чтобы результат слияния строк "не залазил" в область, занятую другими переменными, память, выделяемая для результирующей строки, должна быть не меньше, чем сумма длин склеиваемых строк, плюс единица.

На рисунке показано, как выполняется слияния строк "Информ" и "атика":

а

т

и

к

а

\0

И

н

ф

о

р

м

\0 а

т

и

к

а

\0

Исходная, затем результирующая строка (dest)

Чтобы результат слияния строк "не залазил" в область, занятую другими переменными, память, выделяемая для результирующей строки, должна быть не меньше, чем сумма длин склеиваемых строк, плюс единица.

Функция strcat возвращает указатель на результирующую строку.

ЗАДАНИЕ 3 (слияние строк)

1. Какая ошибка допущена в следующем фрагменте программы:

strcat("first","second");

Дать объяснение, основываясь на методе выделения памяти для литералов (константных строк) в среде выполнения программы.

2. В программе определить массив из 20 элементов типа char. Скопировать в этот массив строку "first". Далее конкатенировать с результатом копирования сначала строку из одного пробела, а затем строку "second" (т.е. в массиве в результате должен будет находиться текст "first second"). Вывести результат на экран, как символьную строку.

Замечание

С помощью "вложенных" вызовов можно соединить операции в одну цепочку. Для этого вызов одной функции нужно сделать аргументом "охватывающей" функции.

Сравнение строк

Операция сравнения строк является очень важной, так как с ее помощью выполняется, например, сортировка элементов в массивах строк.

Смысл операции: последовательно сравниваются коды символов, находящихся на одинаковых позициях в двух строках. Обычно вместо сравнения выполняется вычитание из кода одного символа кода другого, так как эта операция позволяет для "неравных" строк выяснить, какая из "больше" или "меньше".

Сначала предположим, что сравниваемые строки имеют одинаковую длину. Здесь возможны следующие ситуации.

а) Результат вычитания — нуль. В этом случае символы в данной позиции совпадают, и нужно перейти к сравнению символов в следующей позиции.

б) Результат вычитания ненулевой, символы в очередной позиции не совпадают. На этом сравнение закачивается.

Если разность положительна, то первая строка "больше" второй. Если отрицательна — то наоборот. На этом сравнение заканчивается.

Например, строка "abcd" меньше строки "abed", так как ASCII-код символа 'e' (101) больше кода символа 'c' (99).

в) Если коды всех символов строк совпали, то строки "равны".

Если строки имеют разную длину, и все символы более короткой строки совпадают с соответствующими символами более длинной строки, то большей считается "длинная" строка (можно считать, что из кода очередного символа длинной строки вычитается код нуль-терминатора).

В программах на Си для сравнения строк используется библиотечная функция strcmp (от string compare):

char* strcmp(char* s1, char* s2) .

Здесь s1 и s2 — сравниваемые строки.

Функция возвращает

а) положительное число, если строка s1 "больше" строки s2,

б) отрицательное число, если s1 "меньше" s2, и

в) нуль, если строки совпадают.

ЗАДАНИЕ 4 (сравнение строк)

1. Написать функцию

void compare(char* s1, char* s2),

которая принимает через аргументы две строки s1 и s2, сравнивает их, и выводит на экран результат в виде исходных строк, соединенных одним из знаков >, < или =. Например, 124>123.

Для тестирования подобрать:

а) три пары строк одинаковой длины, для которых справедливы три варианта ответа, и

б) две пары строк неодинаковой длины, для которых выполняются отношения "больше" и "меньше".

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