Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
C++ первый курс Alex Жив / C++ Перший курс / old / Lections 1 trim / Додаток до лекції №8 Рядки .doc
Скачиваний:
26
Добавлен:
23.03.2015
Размер:
199.17 Кб
Скачать

Визначення довжини рядків

Дуже часто при роботі з рядками необхідно знати, скільки символів містить рядок. Для з'ясування інформації про довжину рядка в заголовному файлі string.h описана функція strlen. Синтаксис цієї функції має вигляд:

size_t strlen ( const char* string ) ;

Дана функція як єдиний параметр приймає вказівник на початок рядка string, обчислює кількість символів рядка й повертає отримане беззнакове ціле число (size_t). Функція sizeof повертає значення на одиницю менше, чим приділяється під масив через резервування місця для символу '\0'. Наступний фрагмент демонструє використання функції strlen:

char S [ ] = "0123456789" ;

int i = strlen ( S ) ;

char S [20] = "0123456789" ; // оголошення й ініціалізація рядка довжиною 19 символів

cout << "Lenght=" << strlen ( S ) << '\n' ; // вивід на екран Lenght=10

cout << "Size =" << sizeof ( S ) << '\n' ; // вивід на екран Size =20

Часто функція sizeof використовується при введенні рядків як другого параметра конструкції cin.getline, що робить код більш універсальним, тому що не потрібно явної вказівки числа символів, що вводяться. Якщо тепер буде потрібно змінити розмір символьного масиву, досить модифікувати лише одне число при оголошенні рядка символів:

char S [20] ; // оголошення рядка довжиною 19 символів

cin.getline ( S, sizeof ( S ) ) ; // уведення рядка довжиною не більш 19 символів із клавіатури

Копіювання рядків

Значення рядків можуть копіюватися з одного в інший. Для цієї мети використовують ряд стандартних функцій, описуваних нижче.

Функція strcpy

Функція strcpy має прототип:

char* strcpy ( char* str1, const char* str2 ) ;

і виконує побайтне копіювання символів з рядка, на який вказує str2, у рядок по вказівникові str1. Копіювання припиняється тільки у випадку досягнення нуль-термінатора рядка str2, тому перед копіюванням необхідно впевнитися, що довжина str2 менше або дорівнює довжині str1. А якщо ні, то можливе виникнення помилок, пов'язаних з накладенням даних.

Наприклад фрагмент, що випливає, копіює в рядок S значення рядка "String copy":

char S [21] ; // оголошення рядка довжиною 20 символів

strcpy (S, "String copy" ) ; // копіювання рядка "String copy" у рядок S

cout<<S<<'\n' ; // вивід на екран рядка S

Можна робити копіювання не всього рядка, а лише окремого її фрагмента ( до кінця рядка). При цьому другий параметр є вказівником на деякий елемент строкового масиву. Необхідно мати через, що ідентифікатор рядка фактично є вказівником на початок рядка. Наприклад фрагмент, що випливає, скопіює в str2 закінчення рядка str1:

char S1 [21] = "String copy" ; // оголошення й ініціалізація рядка довжиною 20 символів

char S2 [21] ; // оголошення рядка довжиною 20 символів

char* ps = S1 ; // оголошення вказівника на символ і

// його ініціалізація адресою початку рядка S1

cout << ps << '\n' ; // вивід на екран рядка "String copy"

ps += 7 ; // збільшення адреси ps на 7 байт

cout << ps << '\n' ; // вивід на екран рядка "copy"

strcpy (S2, ps ) ; // копіювання рядка "copy" у рядок S2

cout << S2 <<'\n'; // вивід на екран рядка "copy"

Функція strncpy

Функція strncpy відрізняється від strcpy тим, що в її параметрах додається ще один аргумент, що вказує кількість символів, не більше якого буде скопійовано. Її синтаксис має вигляд:

char* stmcpy ( char* strl, const char* str2, size_t num ) ;

Якщо довжина str1 менше довжини str2, відбувається урізування символів:

char slong [ ] = "0123456789" ; // оголошення й ініціалізація рядка довжиною 10 символів

char sshort [ ] = "abcdef" ; // оголошення й ініціалізація рядка довжиною 6 символів

stmcpy ( sshort, slong, 4) ; // копіювання рядка "0123" в у початок рядка sshort

cout << sshort << ' \n' ; // вивід на екран рядок "0123ef"

Тобто з рядка slong у рядок sshort скопійовано чотири перші символи, затерши тим самим вихідне значення початку короткого рядка.