
- •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.3 Функції перетворення буферів
Для роботи з масивом символів, що не має у кінці нульового байта, можна користуватися функціями перетворення буферів. Прототипи цих функцій знаходяться у файлі mem.h. Ці функції дозволяють присвоювати кожному байту в межах вказаного буфера задане значення, а також використовуються для порівняння вмісту двох буферів.
memcpy() – копіювання символів з одного буфера у другий, поки не буде скопійований заданий символ або не буде скопійовано визначену кількість символів
memcmp() – порівнює вказану кількість символів з двох буферів.
Розглянемо детальніше функцію memcpy():
void *memcpy(void *dst, const void *src, size_t n);
де dst – адреса буфера призначення
srс – адреса джерела
n – кількість байт для копіювання.Функція копіює n байт із області пам’яті, на яку вказує src, в область пам’яті, на яку вказує dst. Функція повертає адресу призначення dst.
memcpy() копіює вміст src в буфер dst, наприклад, так:
int i;
for(i = 0; i < n; i++)
((unsigned char*)dst)[i]=((unsigned char*)src)[i];
return dst;
8.4 Функції перевірки літер
У файлі ctype.h описано прототипи функцій, що призначені для перевірки літер. Ці функції повертають ненульове значення (істина), коли її аргумент задовольняє заданій умові або належить вказаному класу літер, та нуль в іншому випадку(табл 8.2).
Таблиця 8.2 – Функції перевірки літер
int islower(int с) |
символ с є малою літерою; |
int isupper(int c) |
символ с є великою літерою; |
int isalnum(int c) |
символ с є буквою або цифрою; |
int isalpha(int c) |
символ с є буквою; |
int tolower(int c) |
перетворення літери у нижній регістр; |
int strtol(int c) |
перетворення рядка у довге ціле число; |
Приклад 8.5. Дана програма перевіряє всі символи, прочитані з стандартного вхідного потоку stdin, і видає повідомлення про кожну малу літеру.
#include <ctype.h>
#include <stdio.h>
#include <conio.h>
int main(void)
{
char ch;
for(;;) {
ch = getch();
if(ch == '.') break;
if(islower(ch)) printf("%c is a small letter\n", ch);
else printf("%c isn't a small latter\n",ch);
}
return 0;
}
Результат роботи програми:
8.5 Операції з рядками
а) Рядки можна ініціалізувати при їх визначенні.
Приклад 8.6. Ініціалізація даних.
char S1[10] = ”123456789”;
char S2[] = ”Srting”’;
char S3[] = {‘1’,‘2’,‘3’,‘\0’};
В двох останніх випадках розмір рядків буде встановлений за кількістю символів;
б) Рядки можна вводити з клавіатури, не використовуючи при цьому оператора циклу, подібно звичайним масивам.
Приклад 8.7. Введення масиву.
char TeMa [20];
printf(“Введіть тему лабораторної роботи:\n”);
scanf(“%s”, TeMa);
Контрольні запитання
Для чого потрібні рядки?
Що таке нульовий символ?
Наведіть приклад функцій, які працюють з рядками.
Наведіть приклад функцій перевірки літер.
Як звертатись до елементів рядка?
Які операції можна виконувати з рядками?
Наведіть приклади ініціалізації рядків.
Що таке символьні константи?
Для чого потрібні символьні константи?
Чим відрізняється символ від рядка, який складається з 1 символу?
Написати програму, яка зчитуватиме з клавіатури слово, і виводитиме на екран всі літери через пробіл.
Написати програму, яка зчитуватиме з клавіатури слово, і виводитиме його на екран навпаки(з останньої літери до першої).
Написати програму, яка зчитуватиме з клавіатури слово, і виводитиме на екран 1, якщо слово є паліндромом і 0 в іншому випадку.
Написати програму, яка зчитуватиме з клавіатури 5 слів, і виводитиме на екран найдовше. Якщо таких кілька, то потрібно вивести перше по алфавітному порядку.