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

Лекція 6 Рядки. Рядкові змінні

Відомо, що рядки – це послідовність символів, які визначаються за допомогою коду ASCIІ, як в мові Паскаль.

Рядкова змінна – це така змінна, що може зберігати послідовність символів, подібно рядку на якому надруковані різні літери або інші символи. Обробка рядкових змінних в Сі має непростий характер, наприклад, в мові Visual Basic це робити зручніше. Рядкова змінна називається змінною- масивом типа char.

Символьним змінним можна присвоювати початкові значення. Це можливо зробити прямо в операторі оголошення. В дійсності можна не вказувати довжину рядка. Далі написані три оператора є еквівалентними:

char Radock [4]= {'c', 'a', 't', '\0'};

char Radock [4]= “cat”;

char Radock [ ]= “cat”;

Якщо текст записується в подвійні лапки, Сі розглядає його як рядок; це означає, що компілятор автоматично добавляє в кінець рядка нульовий символ. В першому прикладі його добавляють явним чином. Якщо в оголошенні рядка пропускається значення індекса, Сі підраховує, скільки символів в літерному рядку, добавляє одиницю, щоб врахувати нулевий символ, і створює рядок-змінну, яка точно відповідає ініційованому тексту. Якщо написати

char Mas [5]= “Україна”;

то це буде помилка, тому що змінна має менший розмір, чим їй присвоюється. Якщо забрати 5, то буде створено рядок потрібної довжини.

Щоб працювати з рядками, потрібно в свої програми включати заголовочні файли, такі, як string.h та stdio.h.

Розглянемо три простих дії над рядками.

Перша: Це знайома нам операція конкатенації, або склеювання рядків. Виконати конкатенацію рядків – це означає взяти другий з них і приставити його в кінець першого рядка; утвориться новий рядок, що є добутком двох рядків.

Для цього використовується функція strcat:

{ char Name [15]= “Igor”;

char NN [ ]= “Ivanov”;

strcat (Name; NN)’;

puts (Name);

}

Рядок, в який записується результат повиннен бути достатньо довгим, щоб вмістити обидва рядки, інакше виникне помилка.

Друга: Функція strcpy ( ) – копіювання рядка: на другому місці на місто першого, вилучаючи значення попереднього:

strcpy (st1, st2 );

Рядок st1 повинен бути більшим за st2.

Третя: Для того, щоб знайти точний розмір рядка використовують функцію strlen ( ).

Вона повертає ціле без знака, яке дорівнює довжині рядка, не враховуючі нульового символа.

Функцію можна використовувати в оператрі присвоювання:

Length = strlen (st1);

Для введення рядків використовуйте функцію gets ( ). Цю функцію можна використовувати і для того, щоб звільнити буфер клавіатури після формального введення. Іноді в буфері залишаються невикористані символи; наступна функція може їх використати, із-за чого буде помилковий результат. Використовуйте оператори типу:

char Trash [80];

gets (Trash);

Для виведення рядка користуйтесь функціями puts(st) і printf (“%s”, st);

Прототипом функції strlen є:

int strlen (char *pointer);

тобто функція чекає, що pointer буде покажчиком на символьну змінну. Звідки функція strlen “знає”, скільки символів у рядку? Вона шукає завершуючий нуль – символ \0. Початок рядка передається функції в якості аргумента; це покажчик. (Згадайте, що покажчик містить адресу початку змінної).

В Сі ім’я масиву є константним покажчиком на його перший елемент. Тому що рядки в Сі – масиви символів, ім’я рядка є покажчиком на початок рядка.

Нульовий символ є важливим моментом. Якщо ви напишите програму, яка створює рядок із окремих елементів, не додавши в кінець нульовий символ у вас будуть неприємності. Функції Сі не цікавляться тим, скільки елементів ви дали масиву, який створює рядок при його оголошені. Вони шукають /0. Обшукують пам’ять байт за байтом, поки не зустрінуть нуль. В результаті з пам’яті буде витягнута купа непотрібної інформації.

Існують ще багато функцій для роботи з рядками. Самі поширені це:

strncpy – для копіювання загального числа символів із одного рядка в інший.

puts ( “\n введіть рядок”);

gets ( sour); puts(“Скільки символів копіювати?”);

scanf ( “%d”, &num);

strncpy ( Res, sonr, num);

printf ( “ Перші %d символів: %s”, num, Res);

strcmp () – функція порівняння двох рядків.

Її прототип – іnt strcmp ( const *char string1, const *char string2);

- strncmp () – функція порівняння частини рядків.

Її прототип – іnt strcmp ( const *char string1, const *char string2, num);

Повертаєме значення менше нуля, якщо string1 менше ніж string2 (тобто string1 іде за алфавітом раніше ніж string2). Значення дорівнює нулю, якщо рядки співпадають. Значення більше нуля, якщо string2 менше string1. Майте на увазі, шо strcmp () розрізняє регістри і великі букви йдуть за алфавітом раніше маленьких.

- strchr () – пошук одного рядка в іншому.

Її прототип – char *strchr ( const char *string, int char_to_find);

Функція повертає покажчик на знайдений в рядку string символ char_to_find. Якщо такого немає, то повертає нуль. Для визначення позиції символа в рядку треба використовувати арифметику покажчиків. Треба відняти із покажчика, що повертає значення, покажчик на початок рядка; результат буде цілим зміщенням, що відповідає положенню символа.

Пошук першого проміжка:

PLOC=strchr (string, ‘_’);

POS= PLOC - string;

strrchr () – шукає останнє входження в рядок, подібна попередній;

strcspn () – шукає в рядку перше входження будь-якого символа із другого рядка;

strstr () – шукає перше входження підрядка, повертає покажчик, тобто char *strstr()

Приклад: 1) Напишіть блок операторів, які знаходять останню кому в рядку.

pPosi=strrchr (Astring, ‘,’);

posi=pPosi-Astring;

2) Напишіть блок операторів, які вивчають рядок на предмет першого входження в неї однієї з десяткових цифр.

strcspn (A string, ’’123456789’’);

Існують ще багато функцій для роботи з рядками, деякі з них використовуються трансляторами мови С++, в разі потреби звертайтесь до довідкової інформації.

Соседние файлы в папке lexzii_08