Символьний рядок - це масив типу char. Наприклад, оголосити рядкову змінну T і ініціалізувати її рядком "Ukraine Technology" можна в такий спосіб:
char T[] = "Ukraine Technology";
або так
char* T = "Ukraine Technology";
Обидва оголошення є еквівалентними.
Якщо рядок являється константою (у нашому прикладі це "Ukraine Technology"), в його кінець автоматично додається символ '\0', він відіграє роль ознаки кінця рядка. Рядки, які завершуються символом '\0', називають asciz-рядками.
Оголосити масив рядків з ініціалізацією кожного рядка заданим словом можна наступним чином:
char* A[20] = { "Понеділок", "Вівторок", "Середа", "Четвер", "П'ятниця", "Субота", "Неділя"
};
Число 20 у цьому оголошенні визначає найбільшу довжину рядка у байтах, який є елементом одновимірного масиву рядків.
Основними операціями, які найбільше часто доводиться програмувати для рядків є:
- операції введення/виведення;
- визначення кількості символів у рядку;
- копіювання символів з одного рядка в інший;
- конкатенація, тобто об’єднання двох рядків в один;
- пошук заданого символу в рядку;
- пошук входження рядка в рядок;
- лексикографічне порівняння рядків.
Введення/виведення рядків
Для програмування операцій консольного введення/виведення застосовуються функції scanf і printf з форматом %s . Частина програми, що наведена нижче, вводить рядок T із клавіатури і далі виводить його на екран для контролю:
char T[100];
scanf("%s",T);
printf("%s",T);
Якщо Ви вже зустрічалися з функцією scanf, зверніть увагу на те, що у другому рядку не треба писати scanf("%s",&T), бо T є ім’ям масиву і водночас покажчиком на нього, звідси значення T саме і є адресою області пам’яті, у яку виконується введення інформації за допомогою функції scanf.
Для виведення значень рядкових змінних на екран можна також використати стандартну процедуру консольного виведення рядка puts:
puts(T);
Для програмування операцій з рядками можна використати функції з бібліотечного модуля string.h . Нижче наведено короткий опис тих функцій із цієї бібліотеки, які застосовуються найбільш часто.
int strlen(char* s);
Повертає довжину рядка s. Довжина рядка визначається як кількість його символів, завершальний нуль-байт не враховується.
char* strcpy(char* dest, char* src);
Виконується копіювання символів з рядка src у рядок dest. Масив символів з адресою destповинен бути досить великим, щоб вміщувати всі символи з масиву src. Функція повертає адресу завершального нуль-байту в масиві dest після копіювання.
char* strcat(char* dest, char* src);
Функція виконує конкатенацію рядків: до рядка dest приєднується рядок src. Повертається покажчик на масив-результат dest. Розмір масиву символів з адресою dest повинен бути достатнім для виконання цієї операції.
char* strchr(char* s, int x);
Виконується пошук першого входження символу x у рядок s. Вертається адреса знайденого входження. Якщо символ x не знайдений, вертається значення NULL .
char* strstr(char* s1, char* s2);
Виконується пошук першого входження рядка символів s2 у рядок s1. Повертається адреса першого символу для знайденого входження або NULL, якщо входження не виявлене.
int strcmp(char* s1, char* s2);
Виконується лексикографічне порівняння рядків. Функція повертає значення:
-1, якщо s1 < s2 ,
0, якщо s1 == s2 ,
1, якщо s1 > s2 .
Лексикографічне відношення S1<S2 виконується, якщо рядок S1 у алфавітному порядку розташовується раніше, ніж рядок S2.
Розглянемо як приклад можливу реалізацію функції для копіювання asciiz-рядка символів. Наведена нижче функція працює точно так, як бібліотечна функція strcpy з модулю string.h.
// Приклад 1
char* scopy(char* D, char* S)
{ while (*D++ = *S++);
return D-1;
}
У наступному прикладі наведено функцію, яка визначає довжину asciiz-рядка символів (враховуючи завершальний нуль-байт). Функція працює аналогічно функції strlen з модулю string.h.
// Приклад 2
int len(char *s)
{ int L=1; while (*s++) L++;
return L;
}