Урок 7: Рядки – Перетворюємо Символи в Слова (І Надаємо Їм Змісту)
Вітаю знову, безстрашний досліднику коду! 👋
Сьогодні ми вирушаємо у світ рядків — бо, чесно кажучи, числа класні, але інколи потрібні й слова! Чи це друкування імені, чи зчитування речення, чи надання твоїй програмі трохи людяності, рядки — це те, що тобі потрібно.
Отже, візьми свою чашку кави (або чаю, я не судитиму), і давай навчимося маніпулювати символами, як справжні профі.
Що Таке Рядок?
Рядок у C — це, по суті, масив символів. Так-так, наші улюблені масиви повертаються! Але цього разу ми зберігаємо не числа, а символи, які, об’єднуючись, утворюють слова, речення чи навіть абзаци.
У C рядки — це масиви типу char
, які закінчуються спеціальним символом, що називається нульовий термінатор (\0
), який вказує програмі, де рядок закінчується.
Ось як можна оголосити рядок:
char ім_я[10] = "Аліса";
Пояснення: Ми оголосили масив символів ім_я
, що може зберігати до 10 символів. Рядок "Аліса"
зберігається в цьому масиві, і C автоматично додає нульовий термінатор в кінці.
Друкування Рядків
Друкувати рядки так само просто, як використовувати printf
з форматом %s
. Спробуємо:
#include <stdio.h>
int main() {
char ім_я[10] = "Аліса";
printf("Привіт, %s!\n", ім_я);
return 0;
}
Пояснення: Ми використали %s
, щоб вивести рядок, що зберігається в масиві ім_я
. Легкотня, правда?
Отримання Рядків від Користувача
Отримання рядка від користувача може бути трохи хитрим у C. Можна використати scanf
, але це може бути ризиковано (якщо користувач введе занадто багато тексту). Безпечніший варіант — це fgets
, який дозволяє обмежити кількість символів для зчитування.
Ось як можна безпечно отримати рядок від користувача:
#include <stdio.h>
int main() {
char ім_я[50];
printf("Введи своє ім'я: ");
fgets(ім_я, sizeof(ім_я), stdin); // Безпечніше за scanf
printf("Привіт, %s", ім_я);
return 0;
}
Пояснення: fgets
зчитує до 49 символів (залишаючи місце для нульового термінатора) з введення користувача і зберігає їх у масиві ім_я
. Зверни увагу, як ми використовуємо sizeof(ім_я)
, щоб уникнути переповнення пам’яті.
Примітка: У C
strlen
рахує байти, а не символи. Це означає, що в UTF-8 рядках, таких як"Привіт"
, де кожна літера займає 2 байти,strlen("Привіт")
поверне12
, а не6
. У разі потреби рахуйте символи окремою функцією, яка підтримує UTF-8.
Маніпуляція Рядками
Тепер поговоримо про маніпуляцію рядками. Оскільки рядки — це просто масиви символів, ти можеш отримати доступ до окремих символів і змінювати їх за допомогою індексу, як у будь-якому іншому масиві.
Ось приклад зміни першої літери рядка:
#include <stdio.h>
int main() {
char ім_я[] = "Боб";
printf("Оригінальне ім'я: %s\n", ім_я);
ім_я[0] = 'Р'; // Змінюємо 'Б' на 'Р'
printf("Змінене ім'я: %s\n", ім_я);
return 0;
}
Пояснення: Ми отримали доступ до першого символу рядка (індекс 0
) і змінили його з 'Б'
на 'Р'
, перетворивши "Боб"
на "Роб"
.
Функції для Роботи з Рядками
C надає набір функцій для роботи з рядками. Ось кілька найпоширеніших:
strlen
– Визначає довжину рядка (без нульового термінатора).strcpy
– Копіює один рядок в інший.strcmp
– Порівнює два рядки, щоб визначити, чи однакові вони.strcat
– Об’єднує (склеює) два рядки.
Спробуймо їх:
#include <stdio.h>
#include <string.h> // Потрібно для роботи з рядками
int main() {
char перший[20] = "Привіт";
char другий[20] = "Світ";
printf("Довжина першого: %lu\n", strlen(перший)); // %lu для типу size_t
strcat(перший, другий); // Об'єднує другий рядок із першим
printf("Після об'єднання: %s\n", перший);
strcpy(другий, "Усім");
printf("Новий другий: %s\n", другий);
if (strcmp(перший, другий) == 0) {
printf("Рядки однакові.\n");
} else {
printf("Рядки різні.\n");
}
return 0;
}
Пояснення:
strlen(перший)
повертає довжину рядка"Привіт"
.strcat(перший, другий)
об’єднує"Світ"
з кінцем рядка"Привіт"
, отримуючи"ПривітСвіт"
.strcpy(другий, "Усім")
копіює"Усім"
у другий рядок, замінюючи"Світ"
.strcmp(перший, другий)
порівнює рядки і повідомляє, чи вони однакові чи різні.
Рядки і Вказівники
У C можна працювати з рядками і через вказівники. Ось швидкий приклад:
#include <stdio.h>
int main() {
char *ім_я = "Аліса";
printf("Привіт, %s!\n", ім_я);
return 0;
}
Пояснення: Тут ім_я
— це вказівник на рядок "Аліса"
. Це більш ефективний спосіб управління пам’яттю для роботи з рядками, але він потребує обережності, щоб уникнути випадкового перезапису пам’яті.
Домашнє Завдання: Опитування про Улюблений Фільм
Створи програму, яка:
- Запитує в користувача назву його улюбленого фільму.
- Виводить повідомлення, що включає назву фільму.
- Використовує
strlen
, щоб вивести, скільки символів у назві фільму.
Заключні Думки
Вітаю! Ти щойно опанував основи роботи з рядками в C. Рядки неймовірно корисні для обробки тексту, і вони є всюди в програмуванні. У Уроці 8 ми зануримось у світ функцій, розширюючи те, що ти вже вивчив. Побачимось там! 🎉✨
See also
- Урок 8: Вказівники та Пам'ять – Як Керувати Адресами (І Не Заблукати!)
- Урок 6: Масиви – Організуй Свої Дані Як Профі
- Урок 5: Функції – Як Навести Порядок у Хаосі (І Уникнути Повторення Коду!)
- Урок 4: Структури Управління – Як Приймати Рішення (І Казати Своїй Програмі Що Робити!)
- Урок 3: Арифметичні Операції – Змусь Свої Змінні Працювати на Тебе!