- •1 Задание
- •2 Требования к реализации
- •3 Методические указания
- •3.1 Файловые потоки ввода-вывода
- •1) Открытие потока
- •2) Закрытие потока
- •3) Ввод/вывод в поток
- •4) Функции позиционирования
- •3.2 Работа со строками
- •Функции работы со строками
- •1) Определение длины строк
- •2) Обращение строк
- •3) Поиск символов
- •3) Поиск подстрок
- •2) Копирование строк
2) Копирование строк
Значения строк могут копироваться из одной в другую. Для этой цели используют ряд стандартных функций.
Функция strcpy () имеет прототип:
char* strcpy(char* strl, const char* str2)
и выполняет побайтное копирование символов из строки, на которую указывает str2, в строку по указателю strl. Копирование прекращается только в случае достижения нуль-терминатора строки str2, поэтому перед копированием необходимо удостовериться, что длина str2 меньше или равна длине strl. В противном случае возможно возникновение ошибок, связанных с наложением данных.
Например, следующий фрагмент копирует в строку Str значение строки "Проверка копирования":
char Str[20];
strcpy(Str, "Проверка копирования");
Можно производить копирование не всей строки, а лишь отдельного ее фрагмента (до конца строки). При этом второй параметр является указателем на некоторый элемент строкового массива. Например, следующий фрагмент скопирует в str2 окончание строки strl:
char strl[20] = "Проверка копирования";
char str2[20];
char* ptr = strl;
ptr += 9;
// ptr теперь указывает на подстроку "копирования" в строке strl
strcpy(str2, ptr);
cout << str2 << '\n';
При выполнении программы будет выведен текст: копирования.
Функция strncpy () отличается от strcpy () тем, что в ее параметрах добавляется еще один аргумент, указывающий количество символов, не больше которого будет скопировано. Ее синтаксис имеет вид:
char* strncpy(char* strl, const char* str2, size_t num)
Если длина strl меньше длины str2, происходит урезание символов:
char cLong[] = "012345678901234567890123456789";
char cShort[]="abcdef";
strncpy(cShort, cLong, 4);
cout << cShort <<'\n';
cout << cLong <<'\n';
В результате будет выведено:
0123ef
012345678901234567890123456789
То есть из строки cLong в строку cShort скопировано четыре первых символа, затерев тем самым исходное значение начала короткой строки.
Функция strdup () в качестве параметра получает указатель на строку-источник, осуществляет распределение памяти, копирует в отведенную область строку и возвращает указатель на начало полученной строки-копии. Синтаксис функции следующий:
char* strdup(const char* source)
В следующем примере производится копирование строки strl в строку str2:
char* strl = "Процедура не найдена";
char* str2;
str2 = strdup(strl);
3) Конкатенация (или присоединение) строк довольно часто используется для образования новой строки символов. Для этой операции стандартная библиотека предлагает функции strcat() и strncat().
Функция strcat () имеет синтаксис:
char* strcat(char* strl, const char* str2)
В результате работы функции содержимое строки, на которую указывает str2, присоединяется к содержимому строки, на которую ссылается strl. Возвращаемый функцией указатель strl указывает на результирующую строку. При этом величина строкового массива strl должна быть достаточной для хранения объединенной строки.
В следующем примере строка str инициализируется с помощью функции копирования strcpy () и дополняется подстрокой, используя функцию strcat ():
char str[81];
strcpy(str, "Для продолжения ");
strcat(str, "нажмите клавишу");
Функция strncat() также осуществляет конкатенацию строк, однако, присоединяет лишь указанное в третьем параметре количество символов (беззнаковое целое):
char* strncat(char* strl, const char* str2, size_t num)
Функция возвращает указатель на начало сформированной строки strl. Следующий пример производит конкатенацию строки strl с семью первыми символами подстроки str2:
char strl[90]="Для продолжения ";
char str2[30]="нажмите клавишу";
strncat(strl,str2,7) ;
cout << strl;
В результате будет выведена строка: "Для продолжения нажмите".