Методичка з C++ - Типи char та wchar_t

Примітка: Ця методичка призначена для вивчення роботи з символьними типами даних у C++.

1. Тип char

Тип char використовується для зберігання окремих символів. Займає 1 байт пам'яті.

#include <iostream>
using namespace std;

int main() {
    // Оголошення змінних типу char
    char symbol1 = 'A';
    char symbol2 = 65; // ASCII код для 'A'
    char symbol3 = 'Я'; // Українська літера
    
    // Виведення символів
    cout << "symbol1: " << symbol1 << endl;
    cout << "symbol2: " << symbol2 << endl;
    cout << "symbol3: " << symbol3 << endl;
    
    // Виведення ASCII кодів
    cout << "Код symbol1: " << (int)symbol1 << endl;
    cout << "Код symbol3: " << (int)symbol3 << endl;
    
    return 0;
}
   

Отримання коду символу та отримання символу за кодом

Отримати код символу можна за допомогою явного перетворення:

char c = '5';
int k = (int)c;  cout<<k;

Виведе 53.

Отримати символ за його кодом можна за допомогою явного перетворення:


int k = 100;
char c =  (char)k;
cout<<c;

Виведе d.

1.1. Робота з рядками char

  
#include <iostream>
#include <cstring> // для функцій роботи з рядками
int main() {
    // Оголошення рядків
    char str1[] = "Привіт"; // автоматичне визначення довжини
    char str2[20] = "Світ"; // фіксований розмір
    char str3[50];
    
    // Копіювання рядків
    strcpy(str3, str1); // копіюємо str1 в str3
    strcat(str3, " "); // додаємо пробіл
    strcat(str3, str2); // додаємо str2    
    cout << "Результат: " << str3 << endl;
    cout << "Довжина: " << strlen(str3) << " символів" << endl;    
    return 0;}
     

2. Тип wchar_t

Тип wchar_t використовується для роботи з широкими символами (Unicode). Розмір залежить від системи (зазвичай 2 або 4 байти).

#include <iostream>
#include <cwchar>

int main() {
    // Широкі символи та рядки
    wchar_t wideChar = L'ї'; // префікс L для широких символів
    wchar_t wideString[] = L"Привіт світ 🌍";
    
    // Використання wcout для виведення широких рядків
    wcout.imbue(locale("uk_UA.UTF-8")); // встановлюємо локаль
    wcout << L"Символ: " << wideChar << endl;
    wcout << L"Рядок: " << wideString << endl;
    wcout << L"Довжина рядка: " << wcslen(wideString) << endl;    
    return 0;
}
Увага! Для коректної роботи з широкими символами потрібно правильно налаштувати локаль.

3. Порівняння char та wchar_t

Характеристика char wchar_t
Розмір 1 байт 2 або 4 байти (залежить від системи)
Кодування ASCII / UTF-8 UTF-16 / UTF-32
Підтримка Unicode Обмежена (через UTF-8) Повна
Потоки введення/виведення cin/cout wcin/wcout
Функції для роботи з рядками strlen, strcpy, strcat wcslen, wcscpy, wcscat

4. Практичні приклади

4.1. Конвертація між char та wchar_t

  
#include <iostream>
#include <locale>
#include <codecvt>
#include <string>

int main() {
    // Звичайний рядок
    char narrowStr[] = "Привіт Україна 🇺🇦";
    
    // Конвертація в широкий рядок
    std::wstring_convert<std::codecvt_utf8<wchar_t>> converter;
    std::wstring wideStr = converter.from_bytes(narrowStr);
    
    wcout.imbue(locale("uk_UA.UTF-8"));
    wcout << L"Широкий рядок: " << wideStr << endl;
    wcout << L"Довжина: " << wideStr.length() << L" символів" << endl;
    
    return 0;
}
       

4.2. Робота з українським текстом

  
#include <iostream>
#include <string>
#include <locale>

int main() {
    // Встановлення локалі для української мови
    setlocale(LC_ALL, "uk_UA.UTF-8");
    
    // Український текст у звичайних рядках
    char ukrainianText[] = "Це український текст: ґедзь, європа, їжачок";
    cout << ukrainianText << endl;
    
    // Підрахунок голосних літер
    char vowels[] = "аеиіоуяюєїАЕИІОУЯЮЄЇ";
    int vowelCount = 0;
    
    for (int i = 0; ukrainianText[i] != '\0'; ++i) {
        for (int j = 0; vowels[j] != '\0'; ++j) {
            if (ukrainianText[i] == vowels[j]) {
                vowelCount++;
                break;
            }
        }
    }
    
    cout << "Кількість голосних: " << vowelCount << endl;
    
    return 0;
}

5. Вправи для самостійної роботи

Ввід символів

Для введення можна використовувати функцію cin. Символи вводяться в рядок або стовпчик. Вводити в рядок можна через пробіл або без пробілу.

Ця функція при вводі пропускає пробіли та символи кінця рядку, які виводяться у буфер вводу при натисканні клавіши Enter.

Наприклад:


int i,n; char c;
cin>>n;
for(i=1; i<=n; i++)
{
   cin>>c;
}

Вводити можна так:


4
a b c d  

Можна так:


4
abcd  

А можна так:


4
a  
b  
c  
d  

Ввід виконується, доки не буде введено потрібну кількість символів. Будь-які символи, які були введені після необхідної кількості (у тому числі Enter), залишаються у буфері.

Вправа 1:

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

Вправа 2:

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

Вправа 3:

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

Корисні поради: