Урок 7: Рядки – Перетворюємо Символи в Слова (І Надаємо Їм Змісту)


Урок 7

Урок 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 надає набір функцій для роботи з рядками. Ось кілька найпоширеніших:

  1. strlen – Визначає довжину рядка (без нульового термінатора).
  2. strcpy – Копіює один рядок в інший.
  3. strcmp – Порівнює два рядки, щоб визначити, чи однакові вони.
  4. 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;
}

Пояснення: Тут ім_я — це вказівник на рядок "Аліса". Це більш ефективний спосіб управління пам’яттю для роботи з рядками, але він потребує обережності, щоб уникнути випадкового перезапису пам’яті.


Домашнє Завдання: Опитування про Улюблений Фільм

Створи програму, яка:

  1. Запитує в користувача назву його улюбленого фільму.
  2. Виводить повідомлення, що включає назву фільму.
  3. Використовує strlen, щоб вивести, скільки символів у назві фільму.

Заключні Думки

Вітаю! Ти щойно опанував основи роботи з рядками в C. Рядки неймовірно корисні для обробки тексту, і вони є всюди в програмуванні. У Уроці 8 ми зануримось у світ функцій, розширюючи те, що ти вже вивчив. Побачимось там! 🎉✨


See also