
- •1 Основні елементи мови с
- •1.1 Алфавіт мови програмування
- •1.2 Лексеми
- •1.3 Ключові слова
- •1.4 Ідентифікатори
- •1.5 Класифікація типів даних
- •1.6 Літерали
- •1.7 Оператори
- •1.8 Коментарі
- •1.9 Директиви препроцесора
- •1.10 Організація програми
- •2 Операції та вирази
- •2.1 Загальні відомості
- •2.2 Арифметичні операції
- •2.3 Операції приведення типів
- •2.4 Операції присвоєння
- •2.5 Операції інкремента і декремента
- •2.6 Операції порівняння
- •2.7 Операції зсуву
- •2.8 Порозрядні операції
- •2.9 Логічні операції
- •2.10 Операція sizeof
- •2.11 Операція послідовного обчислення
- •2.12 Операція умови (?:)
- •2.13 Адресні операції
- •3 Прості типи даних
- •3.1 Оголошення змінних
- •3.2 Час існування та область видимості змінних
- •3.3 Цілі типи даних
- •3.4 Дійсні типи даних
- •4 Оператори керування
- •4.1 Оператор розгалуження if
- •4.2 Оператор розгалуження if-else
- •4.3 Оператор множинного розгалуження switch
- •4.4 Оператор циклу for
- •4.5 Оператор циклу while
- •4.6 Оператор циклу do while
- •4.7 Оператор break
- •4.8 Оператор continue
- •5 Функції
- •5.1 Основні поняття
- •5.2 Види виклику функцій
- •5.3 Область видимості
- •5.4 Порожній тип void
- •5.5 Передача аргументів у функцію
- •5.6 Рекурсивні функції
- •5.7 Прототипи функцій
- •6 Покажчики
- •6.1 Визначення та ініціалізація покажчиків
- •6.2 Визначення покажчиків
- •6.3 Масиви
- •6.4 Операції порівняння
- •6.5 Копіювання рядка
- •6.6 Покажчики на функцію
- •6.7 Покажчики на void
- •6.8 Арифметика покажчиків
- •7 Масиви
- •7.1 Загальні поняття
- •7.2 Одновимірні масиви
- •7.3 Багатовимірні масиви
- •8 Рядки в с
- •8.1 Рядки
- •8.2.Створення рядків
- •8.3 Прототипи
- •8.3 Функції перетворення буферів
- •8.4 Функції перевірки літер
- •8.5 Операції з рядками
- •9 Структури, об’єднання, перерахування
- •9.1 Структури
- •9.2 Бітові поля
- •9.3 Ключове слово typedef
- •9.4 Об’єднання
- •9.5 Перераховуваний тип
- •10 Введення та виведення даних
- •10.1 Функція виведення printf
- •10.2Функція введення scanf
- •10.3 Введення та виведення у файл
- •11 Динамічне виділення пам'яті
8 Рядки в с
8.1 Рядки
Рядки є одним з найбільш корисних та важливих типів даних. У мові С немає окремого типу даних “рядок символів”, подібного до типу string у алгоритмічній мові PASCAL. Тому робота з рядками реалізована шляхом використання одновимірних масивів типу char. Рядок символів – це одновимірний масив типу char, останнім елементом якого є нульовий байт. Нульовий байт – це байт, кожен біт якого рівний нулю, при цьому для нульового байта визначена символьна константа '\0' (ознака закінчення рядка або нуль-термінатор). Тому, якщо рядок містить k символів, в описі масиву потрібно вказати розмірність k+1.. Кожен елемент масиву є типу char. Нульовий символ ‘\0’ автоматично додається останнім байтом символьного рядка та виконує роль ознаки його кінця.
Так, для збереження у масиві рядкової константи “КРУАСАН”, необхідно описати масив char s[7]. В кінці рядкової константи символ \0' вказувати не потрібно, оскільки це зробить компілятор мови С (рис. 8.1).
Приклад 8.1. Оголошення символьного рядка.
#include <string>
int main ()
{
char myString[] = "The world is gray!";
printf("%s\n", myString);
system("pause");
return 0;
}
Результат роботи програми:
Приклад 8.2. Рядок символів.
char s[8]=”КРУАСАН”;
-
0
1
2
3
4
5
6
7
К
Р
У
А
С
А
Н
\0
Рисунок 8.1 – Сприйняття комп’ютером символьного рядка
Так сприймає рядок комп’ютер. Тому, S[0]==’К’, S[6]==’Н’.
Так як рядок в С – це масив символів, що закінчується нуль-символом ‘\0’, то за місцезнаходженням цього символу визначається фактична довжина рядка. (рис. 8.2).
Рисунок 8.2 – Символ і рядок
8.2.Створення рядків
Приклад 8.3. Символьний рядок.
#include <string>
int main ()
{
char myString[] = "string!";
printf("%s\n", myString);
system("pause");
return 0;
}
Результат роботи програми:
Кількість елементів у масиві дорівнює кількості символів у рядку плюс один, оскільки нульовий символ також є елементом масиву. Кожна рядкова константа, навіть у випадку, коли вона ідентична іншій рядковій константі, зберігається у окремому місці пам'яті. Якщо необхідно ввести у рядок символ лапок, то перед ним треба поставити символ зворотного слешу "\". У рядок можуть бути введені будь-які спеціальні символьні константи, перед якими стоїть символ "\".
8.3 Прототипи
Прототипи всіх функцій, що працюють з рядками символів, містяться у файлі string.h. Всі функції працюють з рядками, що закінчуються нульовим символом. Деякі з них описані у таблиці 8.1.
Приклад 8.4. Використання прототипів функцій.
#include <string.h>
#include <stdio.h>
#include <stdlib.h>
int main()
{
char s1[]="Hello, ";
char s2[]={'w','o','r','l','d','!','\0'};
strcat(s1, s2);
printf("s1:%s s2:%s\n", s1, s2);
/* на екран буде виведено: s1:Hello, world! s2: world! */
printf("%c\n", s1[4]);
/* на екран буде виведено літеру o зверніть увагу, що в
даному випадку використано %с замість %s так як виво-
диться лише 1 символ*/
int len=strlen(s1);
/* довжина першого рядка тепер дорівнює 13 */
printf("%i\n", strcmp(s1, s2));
/* програма виведе результат порівняння. */
strcpy(s1, s2);
printf("%s %s %i\n", s1, s2, len);
/* на екран буде виведено: world! world! 13 */
system("pause");
}
Результат роботи програми:
Таблиця 8.1 – Прототипи функцій
Ім’я функції |
Виконання |
int strcmp(const char *, const char *); |
Лексикографічне порівняння рядків. Повертає < 0 якщо перша стрічка менша за другу; > 0 якщо друга стрічка більша за першу і 0, кщо вони рівні. |
int strcat(char *, char *) |
З'єднати два рядки(об’єднаний рядок записується у першу змінну, а друга змінна залишається без змін); |
int strcpy(char *, char *) |
Копіювати рядок s2 у рядок s1(перша змінна дорівнює другій, а друга залишається незмінною); |
int strlen(char *) |
Визначити довжину рядку (кількість символів без нульового символа). |
int strncmp(const char *, const char *, size t) |
Лексикографічне порівняння перших n байтів рядків |
char *strncpy(char *, const char *, size n); |
Копіює до n байт рядка з одного місця в інше |