Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

Пособие

.pdf
Скачиваний:
66
Добавлен:
22.03.2015
Размер:
1.35 Mб
Скачать

14СИМВОЛЬНІ РЯДКИ

14.1Основні відомості про представлення рядків

Символьний рядок представляє собою набір з одного або більше

символів.

«Це рядок»

У мові С немає спеціального типу даних, що можна було б використовувати для опису рядків. Замість цього рядки представляються у вигляді масиву елементів типу char. Це означає, що символи рядка розташовуються у пам’яті в сусідніх комірках, по одному символу в комірці.

Необхідно відмітити, що останнім елементом масиву є символ '\0'. Це нульовий символ (байт, кожний біт якого рівний нулю). У мові С він використовується для того, щоб визначати кінець рядка.

Нульовий символ - це не цифра 0; він не виводиться на друк і в таблиці символів ASCII має номер 0. Наявність нульового символу передбачає, що кількість комірок масиву повинна бути принаймні на одну більше, ніж число символів, що необхідно розміщувати в пам’яті. Наприклад, оголошення char str[10] передбачає, що рядок може містити максимум 9 символів.

Основні методи ініціалізації символьних рядків:

char str1[]= "ABCdef";

char str2[]={'A', 'B', 'C', 'd', 'e', 'f',0};

Зчитування рядка з клавіатури виконується за допомогою наступних функцій:

char str3[100]; gets(str3);

char str4[100]; scanf("%s",str4);

Усі константи-рядки в тексті програми, навіть ідентично записані, розміщуються за різними адресами в статичній пам’яті. З кожним рядком пов’язується сталий покажчик на його перший символ. Власне, рядок-константа є виразом типу «покажчик на char» зі сталим значенням – адресою першого символу.

Так, присвоювання p="ABC" (p - покажчик на char) встановлює покажчик p на символ 'A'; значенням виразу *("ABC"+1) є символ 'B'.

111

Елементи рядків доступні через покажчики на них, тому будьякий вираз типу «покажчик на char» можна вважати рядком.

Необхідно мати також на увазі те, що рядок вигляду "x", - не те ж саме, що символ 'x'. Перша відмінність: 'x' – об’єкт одного з основних типів даних мови С (char), в той час, як "x" – об’єкт похідного типу (масиву елементів типу char). Друга різниця: "x" насправді складається з двох символів - символу 'x' і нуль-символу.

14.2 Функції роботи з рядками

Прочитати рядок із стандартного потоку введення можна за допомогою функції gets(). Вона отримує рядок із стандартного потоку введення. Функція читає символи до тих пір, поки їй не зустрінеться символ нового рядка '\n', що генерується натисканням клавіші ENTER. Функція зчитує всі символи до символу нового рядка, додаючи до них нульовий символ '\0’.

Синтаксис:

char *gets(char *buffer);

Як відомо, для читання рядків із стандартного потоку введення можна використовувати також функцію scanf() з форматом %s. Основна відмінність між scanf() і gets() полягає у способі визначення досягнення кінця рядка; функція scanf() призначена скоріше для читання слова, а не рядка. Функція scanf() має два варіанти використання. Для кожного з них рядок починається з першого не порожнього символу. Якщо використовувати %s, то рядок продовжується до (але не включаючи) наступного порожнього символу (пробіл, табуляція або новий рядок). Якщо визначити розмір поля як %10s, то функція scanf() не прочитає більше 10 символів або ж прочитає послідовність символів до будь-якого першого порожнього символу.

Тепер розглянемо функції виведення рядків. Для виведення рядків можна використовувати функції puts() і printf().

Синтаксис функції puts():

int puts(char *string);

Ця функція виводить всі символи рядка у стандартний потік виведення. Виведення завершується переходом на наступний рядок.

112

Різниця між функціями puts() і printf() полягає в тому, що функція printf() не виводить автоматично кожний рядок з нового рядка.

Стандартна бібліотека мови програмування С містить клас функцій для роботи з рядками, і всі вони починаються з літер str (табл. 14.1). Для того, щоб використовувати одну або декілька функцій, необхідно підключити файл string.h [21].

#include<string.h>

 

 

 

 

 

 

Таблиця 14.1.

 

 

Функції для роботи з рядками

 

 

Прототип функції

 

Призначення

char*

strcat(char*

dest,

Приписує

рядок

source до

const char* source);

 

кінця рядка dest

 

char* strncat(char* dest,

Приписує

n символів рядка

const

char*

source,

source до кінця рядка dest

unsigned n);

 

 

 

 

 

char*

strchr(char*

s,

Знаходить

перше

входження

int ch);

 

 

символу ch у рядок s

int

strcmp(const

char*

Порівнює рядки. Повертає 0,

s1, const char*s2);

 

якщо s1==s2; -1 – якщо

 

 

 

 

s1<s2; і 1 – якщо s1>s2

int strncmp(const char*

Порівнює перші n символів ря-

s1,

const

char*

s2,

дків s1 і s2. Повертає 0, якщо

int n);

 

 

s1==s2; -1 – якщо s1<s2; і 1 –

 

 

 

 

якщо s1>s2

 

int

stricmp(const

char*

Порівнює рядки, ігноруючи ре-

s1, const char*s2);

 

гістр букв. Повертає 0, якщо

 

 

 

 

s1==s2; -1 – якщо s1<s2; і 1 –

 

 

 

 

якщо s1>s2

 

int strnicmp(const

char*

Порівнює перші n символів ря-

s1, const char* s2,

 

дків s1 і s2, ігноруючи регістр

int n);

 

 

букв. Повертає 0, якщо

 

 

 

 

s1==s2; -1 – якщо s1<s2; і 1 –

 

 

 

 

якщо s1>s2

 

char*

strcpy(char*

dest,

Копіює рядок source у рядок

const char* source);

 

dest

 

 

 

 

 

 

 

 

113

char* strncpy(char* dest,

Копіює перші n символів рядка

const

char*

source,

int

source у рядок dest

n);

 

 

 

 

 

 

size_t

 

strlen(const

Обчислює кількість символів,

char* s);

 

 

 

 

що входять у рядок, без обліку

 

 

 

 

 

 

нульового символу наприкінці

char* strlwr(char* s);

 

Переводить рядок s у нижній

 

 

 

 

 

 

регістр

char* strupr(char* s);

 

Переводить рядок s у верхній

 

 

 

 

 

 

регістр

char*

strdup(const

char*

Виділяє пам’ять для рядка s

s);

 

 

 

 

 

 

char*

strset(char*

 

s,

Заповнює рядок s символом ch

int ch);

 

 

 

 

 

char*

strnset(char*

s,

Заміняє перші n символів рядка

int ch, int n);

 

 

 

s символом ch

char* strrev(char* s);

 

Переставляє символи рядка s у

 

 

 

 

 

 

зворотному порядку

size_t

s1,

strcspn(const

Повертає довжину початкового

char*

const

 

char*

відрізка рядка s1, що склада-

s2);

 

 

 

 

 

ється лише із символів, що не

 

 

 

 

 

 

входять у рядок s2

const

char*

strpbrk

Переглядає рядок s1, поки не

(const

char*

 

 

s1,

знайде символ, що належить

const char* s2);

 

 

 

рядку s2

char*

strrchr(char*

s,

Переглядає рядок s1, поки не

int c);

 

 

 

 

 

знайде останній символ, зада-

 

 

 

 

 

 

ний молодшим байтом параме-

 

 

 

 

 

 

тра c

size_t strspn(const char*

Повертає довжину початкового

s1, const char* s2);

 

 

відрізка рядка s1, що склада-

 

 

 

 

 

 

ється лише із символів, що вхо-

 

 

 

 

 

 

дять у рядок s2

char*

strtok(char*

 

s1,

Виділяє фрагменти рядка, вико-

const char* s2);

 

 

 

ристовуючи роздільники.

114

 

 

 

 

 

 

Наприклад,

char *s= "Some string"; int len;

Наступний оператор встановить змінну len рівною довжині рядка, що адресується покажчиком s:

len = strlen(s); /* len == 11 */ char s1[100];

char s2[100];

s1 = s2; /*помилка*/

Останній оператор s1=s2; не зкомпілюється.

Щоб скопіювати один рядок в інший необхідно викликати функцію копіювання рядків strcpy(). Для двох покажчиків s1 і s2 типу char * функція

strcpy(s1,s2);

копіює символи, що адресуються покажчиком s2 в пам’ять, що адресується покажчиком s1, включаючи завершуючи нулі.

Для копіювання рядків можна використовувати і функцію strncpy(), що дозволяє обмежувати кількість символів, що копіюються.

strncpy(destantion, source, 10);

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

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

Конкатенація двох рядків означає їх об’єднання, при цьому створюється новий, більш довгий рядок. Наприклад, при оголошенні ряд-

ка char first[]= "Один "; оператор strcat(first, "два три чотири!"); перетворить рядок first в рядок «Один два три чотири».

115

При виклику функції strcat(s1,s2) потрібно впевнитися, що перший аргумент типу char* ініціалізовано і має достатньо місця, щоб зберегти результат. Якщо s1 адресує рядок, що вже записаний, а s2 адресує нульовий рядок, то оператор strcat(s1,s2); перезапише рядок s1, викликавши при цьому серйозну помилку.

Функція strcat() повертає адресу рядка результату (що збыгаэться з її першим параметром), що дає можливість використати «каскад» декількох викликів функцій:

strcat(strcat(s1,s2),s3);

Цей оператор додає рядок, що адресує s2, і рядок, що адресує s3, до кінця рядка, що адресує s1, що еквівалентно двом операторам:

strcat(s1,s2);

strcat(s1,s3);

Функція strcmp() призначена для порівняння двох рядків. Синтаксис функції:

int strcmp(const char *s1, const char*s2);

Функція strcmp() порівнює рядки s1 і s2 і повертає значення 0, якщо рядки рівні, тобто містять одне й те ж число однакових символів. При порівнянні рядків ми розуміємо їх порівняння в лексикографічному порядку, приблизно так, як наприклад, в словнику. У функції насправді здійснюється посимвольне порівняння рядків.

Кожний символ рядка s1 порівнюється з відповідним символом рядка s2. Якщо s1 лексикографічно більше s2, то функція strcmp() повертає додатне значення, якщо менше, то – від’ємне.

116

 

 

15 ІНДИВІДУАЛЬНІ ЗАВДАННЯ ДО П. 14

 

Завдання

1.

1.

Написати програму, що підраховує кількість букв у словах,

 

уведених з клавіатури. Ознака завершення вводу – рядок 999.

 

2.

Вивести рядок довжини N (N – парне), що складається з сим-

 

волів C1 і C2, що чергуються починаючи з C1.

 

3.

Дано три рядки S1, S2, S3. Замінити у рядку S1 всі входжен-

 

ня рядка S2 на S3.

2.

1.

Дано натуральне число n і символи s1, s2, ..., sn.

 

Підрахувати скільки разів зустрічається символ '+'.

 

2.

Дано рядок. Вивести рядок, що містить ті ж символи, але роз-

 

ташовані у зворотному порядку.

 

3.

Дано рядок. Вивести підрядок, розташований між першою та

 

другою точками заданого рядка. Якщо в рядку менше двох то-

 

чок, то вивести вихідний рядок.

3.

1.

Дано натуральне число n і символи s1, s2, ..., sn.

 

Підрахувати скільки разів серед даних символів зустрічається

 

символ '*'.

 

2.

Дано рядок. Вивести коди її першого і останнього символу.

 

3.

Дано рядок, що складається з російських слів, розділених

 

пробілами (одним або кількома). Визначити кількість слів у ря-

 

дку.

4.

1.

Дано натуральне число n і символи s1, s2, ..., sn.

 

З’ясувати, яких символів більше '+' або '*'.

 

2.

Дано рядок. Підрахувати кількість цифр, що містяться в ній.

 

3.

Дано рядок, що складається з російських слів, розділених

 

пробілами (одним або кількома). Визначити кількість слів, що

 

починаються і закінчуються однією і тією ж буквою.

5.

1.

Напишіть програму, що вводить рядок і виводить його, ско-

 

рочуючи щоразу на 1 символ до тих пір, поки в рядку не зали-

 

шиться 1 символ.

 

2.

Дано рядок. Підрахувати кількість прописних літер, що міс-

 

тяться в ній.

 

3.

Дано рядок, що складається з російських слів, розділених

 

пробілами (одним або кількома). Визначити кількість слів, що

 

містять хоча б одну букву 'А'.

6.

1.

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

 

слово від іншого відділяється одним пробілом.

 

 

117

2.Дано рядок. Підрахувати кількість рядкових букв, що містяться в ній.

3.Дано рядок, що складається з російських слів, розділених пробілами (одним або кількома). Визначити кількість слів, що

містять рівно три літери 'А'.

7.1. Напишіть програму, що підраховує вартість телеграми, текст якої вводиться з клавіатури.

2.Дано рядок. Перетворити всі латинські букви на російські.

3.Дано рядок, що складається з російських слів, розділених пробілами (одним або кількома). Визначити довжину найкоротшого слова.

8.1. Напишіть програму, що визначить, яка з букв, перша чи остання, зустрічаються в заданому слові частіше.

2.Дано рядок. Перетворити всі рядкові букви на прописні.

3.Дано рядок, що складається з російських слів, розділених пробілами (одним або кількома). Визначити довжину найдовшого слова.

9.1. Напишіть програму, що підраховує і виводить на екран скільки разів зустрічається кожна буква.

2.Дано рядок. Якщо він являє собою запис цілого числа, то вивести 1, якщо дійсного (з дробової частиною), то вивести 2; якщо рядок не можна перетворити на число, то вивести 0.

3.Дано рядок, що складається з англійський слів, розділених пробілами (одним або кількома). Вивести рядок, що містить ці

жслова, але розділені символом '.' (Крапка). У кінці крапку не ставити.

10.1. Напишіть програму, що визначає, скільки букв «о», що стоїть на парних місцях.

2.Дано набір цілих чисел. Вивести рядок, що зображує символи у відповідності до ASCII таблиці.

3.Дано рядок, що складається з англійських слів, розділених пробілами (одним або кількома). Вивести рядок, що містить ці

жслова (розділені одним пробілом), але розташовані в зворотному порядку.

11.1. Задані прізвище, ім’я та по батькові учня, розділені пробілами. Напишіть програму, що друкує прізвище учня та його ініціали.

2.Дано ціле число. Вивести набір символів, що містить цифри цього числа в оберненому порядку.

118

3.Дано рядок, що складається з англійських слів, розділених пробілами (одним або кількома). Перетворити кожне слово в рядку, видаливши з нього всі наступні входження першої літери цього слова (кількість пропусків між словами не змінювати).

12.1. Напишіть програму, що видаляє із слова i-у букву.

2.Дано рядок S, що містить дійсне число в форматі з плаваючою крапкою, і ціле число N>0. Вивести набір символів, що зображують перші N цифр дробової частини даного дійсного числа (без округлення).

3.Дано рядок, що складається з англійських слів, розділених пробілами (одним або кількома). Перетворити кожне слово в рядку, видаливши з нього всі попередні входження першої літери цього слова (кількість пропусків між словами не змінювати).

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

2.Дано рядок, що зображає двійковий запис цілого числа. Вивести рядок, що зображає десятковий запис цього ж числа.

3.Дано рядок, що складається з англійських слів, розділених пробілами (одним або кількома). Перетворити кожне слово в рядку, видаливши з нього всі наступні входження останньої літери цього слова (кількість пропусків між словами не змінювати).

14.1. Напишіть програму, що видаляє із слова X всі букви, що зустрічаються в слові Z.

2.Дано рядок, що зображає десятковий запис цілого числа. Вивести рядок, що зображає двійковий запис цього ж числа.

3.Дана рядок, що складається з російських слів, розділених пробілами (одним або кількома). Вивести рядок, що містить ці ж слова (розділені одним пропуском), але розташовані в алфавітному порядку.

15.1. Напишіть програму, що підраховує кількість різних букв у заданому слові.

2.Дано рядок, що зображає ціле число. Вивести суму цифр цього числа.

3.Дано рядок англійською мовою. Перетворити рядок так, щоб кожне слово починалося з великої літери.

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

2.Дано рядок S і число N. Перетворити рядок S у рядок довжи-

119

ни N наступним чином: якщо довжина рядка S більше N, то відкинути перші символи, якщо довжина рядка S менше N, то в її початок додати символи '.'.

3.Дано рядок російською мовою. Підрахувати кількість у рядку розділових знаків.

17.1. Напишіть програму, що в заданому тексті змінює слово «Петро» на слово «Іван».

2.Дано два числа N1 і N2, і два рядки S1 і S2. Отримати з цих

рядків новий рядок, об’єднавши N1 перших символів рядка S1 і N2 останніх символів рядка S2.

3.Дано рядок англійською мовою. Підрахувати кількість голосних букв.

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

2.Дано два рядки S1 і S2. Перевірити, чи міститься рядок S2 у

рядку S1. Якщо так, то вивести номер позиції, починаючи з якої S2 міститься в S1, якщо ні, то вивести 0.

3.Дано рядок російською мовою. Вивести найкоротше слово в реченні (якщо таких слів кілька, то вивести перше з них).

19.1. У заданому тексті замінити всі літери 'а' на букву 'і'.

2.Дано два рядки: S1 і S2. Визначити кількість входжень рядка S2 в рядок S1.

3.Дано рядок російською мовою. Вивести найдовше слово в реченні (якщо таких слів кілька, то вивести останнє з них).

20.1. Скласти програму, що перевертає введене слово, тобто переставляє символи у зворотному порядку.

2.Дано рядок S і символ C. Подвоїти кожне входження C у ря-

док S.

3.Дано рядок, що містить надлишкові пробіли. Перетворити його так, щоб між словами був рівно один пробіл.

21.1. Скласти програму, що визначає, чи є введене слово паліндромом.

2.Дано рядки S1, S2 і символ C. Перед кожним входження си-

мволу C у рядок S1 вставити рядок S2.

3. Дано рядок, що містить повне ім’я файлу, тобто ім’я диска, список каталогів (шлях), власне ім’я та розширення. Виділити з цього рядка ім’я файлу.

22. 1. Напишіть програму, що сортує символи, введені з клавіатури

120