Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

Lab_9_OZP2012

.pdf
Скачиваний:
23
Добавлен:
23.02.2016
Размер:
653.81 Кб
Скачать

Об’єкто – зорієнтоване програмування мовою С++

©Лазорик В.В.

Лабораторна робота №8.

Тема: Символьні рядки. Файли.

Мета роботи полягає у формуванні вмінь:використовувати різні способи опису й формування рядків, розуміти й формулювати принципові відмінності цих способів, обробляти рядка різними способами, читати та записувати рядки у файли.

За деякими оцінками, до 70% машинного часу витрачається на роботу з текстовими рядками, що свідчить про важливість цього типу даних. У той же час у мові С(C++) спеціальний рядковий тип відсутній, хоча є в наявності досить багатий набір функцій обробки рядків. Рядок може бути змодельована різними способами, причому в більшій частині випадків за багатьма деталями повинен стежити програміст. Тому робота з рядками в С(C++) вимагає особливої старанності.

1. Визначення рядка

Спеціальний рядковий тип у мові С(C++) відсутній. Рядок у мові С(C++) представляється одномірним масивом елементів типу char; останнім елементом масиву повинен бути символ '\0'– нуль-термінатор. Такий масив називається ASCIIZ – рядком.

Нуль-термінатор представляє собою символ з кодом 0 у таблиці кодів і визначає кінець рядка; якщо він відсутній, то обробка рядка може тривати як завгодно довго.

Рядкова стала (або рядковий літерал) представляє собою конструкцію:

 

"< послідовність символів >"

 

 

 

 

Символ - " до

 

Символ - " до

сокладу рядка не

 

сокладу рядка

входить

 

не входить

До такої послідовності символ '\0' компілятор додає автоматично.

Якщо у середині рядка потрібно використовувати символ “, то його кодують як через ESC-послідовність тобто \” (знак \ екранує ” ).

Символ '\0'проставляється наприкінці символьної послідовності (масиву) автоматично, якщо:

-ця послідовність представляє собою рядковий літерал;

-послідовність уводиться функцією введення рядка gets ( fgets) або функцією

scanf (fscanf) у форматі %s: scanf(“%s ”,<ім'я рядка>).

Увсіх інших випадках програміст повинен опікуватися про кінець рядка сам.

2.Способи опису рядків.

Враховуючи зв'язок масивів і вказівник (ім'я масиву є вказівником-сталою на перший елемент масиву), рядок можна описати такими способами.

а) опис символьного масиву із вказівкою числа його елементів(як масив):

Резервируется <число елементів >

байтів

char <ім'я>[<число елементів>]; Приклад.

char str1 [10];

//

масив з 10 елементів

з невизначеними значеннями;

 

//

str1 – вказівник

– стала на початок масиву;

 

//потенційний рядок

з 9

символів плюс ‘\0’

б) опис символьного масиву без вказівки числа елементів, але обов’язковою з ініціалізацією:

 

Адреса першого байта літералу стає

char <ім'я>[ ]=<літерал>;

синонімом імені масиву.

 

Приклад.

char str2[] = “string”; // масив з 7 елементів з визначеними значеннями;

1

Об’єкто – зорієнтоване програмування мовою С++

©Лазорик В.В.

// str2 – вказівник-стала на початок масиву;

в) опис вказівника на тип char з ініціалізацією літералом:

Адреса першого байта літералу стає синонімом імені масиву.

char * <ім'я_вказівника> =<літерал>;

Приклад.

char *str3 = “string”;

// масив з 7 елементів з визначеними значеннями;

//str3 – вказівник-змінна на початок масиву;

Увипадку б) та в) компілятор самостійно підрахує кількість елементів літералу разом

знуль-термінатором та виділить необхідний масив. Вказівник у випадку в) змінювати небажано, так як можемо втратити адресу початку масиву, тому бажано задавати наступним чином

char *const <ім'я_вказівника> =<літерал>;

Приклад.

char *const str4 = “string”; // масив з 7 елементів з визначеними значеннями; // str4 – вказівник-стала на початок масиву;

д) опис вказівника на тип char: char *<ім'я_вказівника> ;

Приклад.

char *str5;

// str5 – вказівник - змінна на тип char;

У цьому випадку масив(рядок) не створюється, тому для того щоб створити рядок необхідно виділити динамічну пам'ять під рядок, наприклад, функцією malloc (або сalloc, або операцію new ) :

<ім’я>= ( char*) malloc(<число елементів >);

Число елементів, що будемо виділяти повинне рівнятися числу значущих символів рядка плюс 1 байт для нуль-термінатора.

Приклад.

char *

str5;

// str5 – вказівник - змінна на тип char;

str5=(

char *)malloc(10); //тепер str5 вказує на перший байт поля з 10 байтів

Відмінності у визначенні рядка як масиву та через вказівник

Розглянемо відмінності у визначенні рядка як масиву та через вказівник на прикладі. Нехай потрібно створити два рядки, що містять слово з 6 букв string, причому одну з рядків треба ввести із клавіатури, а потім скопіювати в інший рядок.

char str1 [10]; // масив з 10 елементів з невизначеними значеннями; char *str2, *str3; // два вказівника на символьний тип; нікуди не вказують;

int i;

// Виділимо пам'ять під str2

str2=( char *)malloc(10); //тепер str2 вказує на перший байт поля з 10 байтів

 

// Уведемо str2

 

scanf(“%s”, str2);

// уведення послідовності

символів як рядка, тобто із

 

// проставлянням ‘\0’ наприкінці;

 

//

str2 указує на рядок з

7 символів

 

//

Скопіюємо str2 в str1

 

for(i=0; i<7; i++)

str1[i]= str2[i]; // елементи рядка str2 обробляємо як елементи масиву

//Записати str1= str2 не можна, тому що str1 – вказівник-стала!

//Виведемо обидві рядки

printf(“str1=%s \n =%s \n”, str1, str2);

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

2

Об’єкто – зорієнтоване програмування мовою С++

 

©Лазорик В.В.

 

Трактовка за

 

 

 

 

 

 

 

 

 

 

 

 

замовчанням

 

Звернення до

 

 

 

 

Пам’ять

str1

 

 

 

 

елемента масиву

 

 

 

виділена при

 

 

 

 

 

 

 

 

 

 

 

 

 

компіляції

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

*str1 == str1[0] … *(str1+i) == str1[i] …

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

s

 

t

r

i

n

 

g

\0

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

0

1

2

3

4

5

6

 

7

8

9

 

Пам’ять

 

 

 

 

 

 

 

 

 

 

 

 

виділена при

 

 

 

 

 

 

 

 

 

 

 

 

компіляції

 

 

 

 

 

 

 

 

 

 

 

Пам’ять виділена

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

Звернення до

 

 

 

 

динамічно при

str2

 

 

 

 

 

 

 

 

 

виконанні

 

 

 

 

 

елемента масиву

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

програми

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

*str2 == str2[0] … *(str2+i) == str2[i] …

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

s

 

t

r

i

n

 

g

\0

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

0

1

2

3

4

5

6

 

7

8

9

 

Коментар

У підсумку маємо ту саму картину для обох рядках, хоча механізми формування рядків при різних способах опису принципово різні.

3.Використання літералів

Будучи сталим рядком, літерал представляється як масив елементів типу char із

символом ‘\0’ наприкінці, тобто з ним (літералом) зв'язаний вказівник-стала на перший елемент. Будучи сталою, літерал розміщається в пам'яті компілятором і зберігається в сегменті даних завантажувального модуля програми.

Літерал використовується:

1)для ініціалізації масиву типу char; адреса першого байта літерала стає синонімом імені масиву;

2)для ініціалізації вказівника типу char *; адреса першого символу літерала стає початковим значенням вказівника;

3)у виразах, там, де дозволяється застосовувати вказівник; компілятор підставляє

замість літерала адресу його першого символу. Розглянемо приклад описів з ініціалізацією літералами

char str1[ ]=”string”;

// адреса першого

байта

літерала - синонім імені масиву

char *ptr1 =”string”;

// адреса першого

символу

літерала - початкове значення ptr1

char

str2 [10];

//

масив з 10 елементів

з

невизначеними значеннями

char

*ptr2;

//

ptr2 нікуди не

вказує

 

 

// Приклад виконання операторів

ptr2= ptr1; // ptr2 одержує значення адреси другого літерала // Виконання помилкове !!!

str2 =”string”; // не можна!!! str2 – вказівник-стала;

//значення в масив str2 можна виводити(друкувати) або присвоювати

Картина в пам'яті комп'ютера

Розглянемо, як масиви будуть представлятися в пам’яті комп’ютера. Нехай кожний літерал розміщається окремо.

а) масив str1; збігається з першим літералом;

3

Об’єкто – зорієнтоване програмування мовою С++

©Лазорик В.В.

-масив str2 [10]; виділяється своя область пам'яті;

str1

 

 

 

 

 

 

 

<адр1>

 

 

 

 

 

 

Перший літерал, використову-

 

 

 

 

 

 

 

ється для інініціалізації str1

 

s

t

r

i

n

g

\0

<адр1>

0

1

2

3

4

5

6

 

б ) вказівник ptr1; вказує на другий літерал;

 

 

 

ptr1

 

 

 

 

 

 

 

<адр2>

 

 

 

 

 

 

 

 

Інініціалізація

 

 

Перший літерал, використову-

 

 

 

ється для інініціалізації str2

 

 

 

 

 

 

<адр2>

s

t

r

i

n

g

\0

 

0

1

2

3

4

5

6

ptr2

 

Присвоєння ptr2= ptr1

 

 

 

 

 

 

<адр2>

в) вказівник ptr2; спочатку нікуди не вказує, після присвоєння ptr2= ptr1,також вказує на другий літерал

г) масив str2 [10]; виділяється своя область пам'яті;

str2

 

 

 

 

 

 

 

Масив не заповнений;

 

 

 

 

 

 

 

значення елементів потрібно

 

 

 

 

 

 

 

 

 

адр3

 

 

 

 

 

 

 

ввести.

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

?

?

?

 

 

 

 

 

 

 

?

 

 

 

 

 

 

 

 

 

 

 

 

 

 

0

1

2

3

4

5

6

7

8

9

 

Варто пам'ятати: при роботі з вказівником на рядок цей вказівник повинен указувати на виділену пам'ять, тобто або на літерал (пам'ять виділяється компілятором), або на динамічно виділену область.

4.Обробка рядків

Опишемо тільки основні функції для роботи з рядками.

Функції введенняиведення рядків в мові С.

Функції введення – виведення описані в заголовному файлі <stdio.h>. Для введеннявиведення можна використати функції форматованого введення - виведення з форматом рядка – «%s».

Введення для стандартного потоку – stdin та довільного (файлового)потоку

int scanf (char* <форматний рядок>,<список введення>)

int fscanf (FILE* <вказівник потоку>,char* <форматний рядок>,<список введення>)

Результат – число правильне виконаних присвоювань або EOF у випадку закінчення

файлу.

Виведення для стандартного потоку - stdout та довільного (файлового )потоку

int printf (char* <форматний рядок>,<список введення>)

int fprintf (FILE* <вказівник потоку>,char* <форматний рядок>,<список виведення>)

Результат – число виведених знаків.

4

Об’єкто – зорієнтоване програмування мовою С++

©Лазорик В.В.

Увага! Функції fscanf(), scanf() вводять символи до першого пробілу або символу '\0', тому рядка із пробілами треба вводити функціями fgets(), gets() (див. нижче).

Спеціалізовані введення-виведення рядків.

Використовуються спеціальні функції введення-виводу рядків, без вказівки формату. Введення для стандартного потоку - stdin та довільного (файлового) потоку.

char* gets(char*<вказівник рядка>)

char* fgets (char*<вказівник рядка>, int <число символів>, FILE* <вказівник потоку>)

Дія: із вхідного потоку (стандартного потоку або файлового потоку) зчитуються символи до першого символу '\n' ( кінець рядка) або до кінця потоку або до прочитання (n-1) символу в функції fgets().

Результат заноситься в рядок; у кінець додається нульовий символ '\0'). Якщо n=1, то формується порожній рядок.

Функція повертає значення адреси рядка або NULL у випадку помилки, а також при досягнення кінця файлу ( розрізнити ці ситуації можна за допомогою функцій feof() або

ferror()).

Виведення у стандартний потік виведення - stdout та у довільний (файловий )потік.

int puts(char*<вказівник рядка>)

int fputs (char*<вказівник рядка>, FILE* <вказівник потоку>)

Дія, результат: копіює рядок у потік з поточної позиції. Символ '\0'не копіюється. значення, що вертається, залежить від версії системи (0 у випадку вдачі, не рівне

нулю значення при невдачі; або код останнього записаного символу або EOF при невдачі).

5. Функції роботи з рядками(масивами символів)

Окремі символи рядка можна обробляти як елементи масиву. Функції роботи з рядками описані в заголовних файлах <string.h>, <stdlib.h> та <math.h>.

У стандартному файлі заголовку <string.h> описані функцій, які допомагають працювати з C рядками та масивами символів. У файлі визначено функції та

/* MACROS */

#define NULL <either 0, 0L, or (void *)0> [0 in C++] /* TYPES */

typedef ui-type size_t; // typedef unsigned int size_t;

Функції за призначенням можна поділити на групи. Функція яка починається з букв str працює з C рядками, а функції - mem з масивами символів.

Довжина рядка.

strlen

size_t strlen(const char *s);

Функція повертає кількість символів у рядку s не включаючи завершальний нульовий символ (‘\0’) - \0'.

Об’єднання(конкатинація) рядків.

Strcat strncat

char *strcat(char *restrict s1, const char *restrict s2);

char *strncat(char *restrict s1, const char *restrict s2, size_t n);

Функція strcat копіює рядок s2, включаючи завершальний нульовий символ ('\0') , послідовність елементів масиву в рядок s1. Повертає s1.

Функція strncat копіює рядок s2, включаючи завершальний нульовий символ ('\0'), послідовність елементів масиву в рядок s1. Функція копіює не більше ніж n символів з s2. Потім функція заповнює нульовими символами решту комірок, якщо вони залишилися у рядку s1. Повертає s1.

Копіювання.

strcpy, strncpy

char *strcpy(char *restrict s1, const char *restrict s2);

char *strncpy(char *restrict s1, const char *restrict s2, size_t n);

Функція strcpy копіює рядок s2 в s1 , включаючи завершальний нульовий символ (‘\0’). Повертає s1.

5

Об’єкто – зорієнтоване програмування мовою С++

©Лазорик В.В.

Функція strncpy копіює рядок s2 в s1 , не включаючи завершальний нульовий символ (‘\0’), не більше ніж n символів з s2. Потім функція заповнює нульовими символами ('\0') решту комірок, якщо вони залишилися у рядку s1. Повертає s1.

memcpy

void *memcpy(void *restrict s1, const void *restrict s2, size_t n);

Функція копіює масив символів, починаючи з адреси s2 в масив символів, починаючи з адреси s1 (обидва розміру n). Вона повертає s1. Елементи масиву можуть бути доступні і зберігаються в довільному порядку.

memmove

void *memmove(void *s1, const void *s2, size_t n);

Функція копіює масив символів, починаючи з s2 в масив символів, починаючи з s1 (обидва розміру n). Вона повертає s1. Якщо масиви перекриваються, функція звертається до кожного з елементів значення s2 перед зберігає нове значення в тому, що елемент, так що копія не пошкоджені.

memset

void *memset(void *s, int c, size_t n);

Функція заповнює масив s розміром n байтом(символом) c. Повертається s. Порівняння.

strcmp strcoll

int strcmp(const char *s1, const char *s2);

int strncmp(const char *s1, const char *s2, size_t n); int strcoll(const char *s1, const char *s2);

Функція strcmp виконує лексикографічне порівняння послідовні елементи з двох рядків s1 та s2, поки не знаходить елементів, які не рівні.

Функція strncmp виконує лексикографічне порівняння послідовні елементи з двох рядків s1 та s2, поки не знаходить елементів, які не рівні, або поки він порівняти перші n елементів з двох рядків.

Функція виконує лексикографічне порівняння послідовні елементи з двох рядків s1 та s2, використовуючи порівняння правило, залежить від поточної локалізації(collating order). Функції повертають:

Якщо всі елементи рівні, функція повертає нуль.

Якщо відмінність елемента з s1 більше ніж s2 елемент, функція повертає додатне число.

В іншому випадку функція повертає від'ємне число.

memcmp

int memcmp(const void *s1, const void *s2, size_t n);

Функція порівнює послідовні елементи двох масивів символів, починаючи з адреси s1 та s2 (обидва розміру n), поки не знаходить елементів, які не рівні:

Якщо всі елементи рівні, функція повертає нуль.

Якщо відмінність елемента з s1 більше ніж s2 елемент, функція повертає додатне число.

В іншому випадку функція повертає від'ємне число.

Пошук.

strchr, strrchr

char *strchr(const char *s, int c); [not in C++] const char *strchr(const char *s, int c); [C++ only] char *strchr(char *s, int c); [C++ only]

char *strrchr(const char *s, int c); [not in C++] const char *strrchr(const char *s, int c); [C++ only] char *strrchr(char *s, int c); [C++ only]

Функції strchr та strrchr пошуку елемента який рівний (символу) c у рядку s. Функція strchr здійснює пошук з початку, а strrchr - з кінця. В разі успіху, функція повертає адресу відповідного елемента, в іншому випадку вона повертає NULL вказівник .

memchr

void *memchr(const void *s, int c, size_t n); [not in C++]

6

Об’єкто – зорієнтоване програмування мовою С++

©Лазорик В.В.

const void *memchr(const void *s, int c,

size_t n); [C++ only]

void *memchr(void *s, int c, size_t n); [C++ only]

 

Функція шукає memchr перший елемент int c масиву, починаючи з адреси void *s розміром size_t n. В разі успіху, вона повертає адресу відповідного елемента, в іншому випадку вона повертає NULL вказівник .

strpbrk

char *strpbrk(const char *s1, const char *s2); [not in C++] const char *strpbrk(const char *s1, const char *s2); [C++ only] char *strpbrk(char *s1, const char *s2); [C++ only]

Функція знаходить перше входження в рядку s1 будь-якого символу з , перерахованого з рядка s2. Якщо символ знайдений у рядку тоді функція повертає його адресу, в іншому випадку вона повертає вказівник NULL.

strstr

char *strstr(const char *s1,const char *s2); [not in C++] const char *strstr(const char *s1,const char *s2); [C++ only] char *strstr(char *s1, const char *s2); [C++ only]

Функція находить перше входження рядка s1 в s2, не включаючи завершальний нульовий символ ('\0'). В разі успіху, функція повертає адресу першого елемента відповідності, в іншому випадку вона повертає NULL вказівник .

strcspn

size_t strspn(const char *s1, const char *s2); size_t strcspn(const char *s1, const char *s2);

Функція strspn визначає максимальну довжину першого підрядка, що складається виключно з байтів(символів), які перераховані в рядку s2. Повертає довжину.

Функція strcspn визначає максимальну довжину першого підрядка, що складається виключно з байтів(символів), які не перераховані в рядку s2. Повертає довжину.

Перетворення рядка.

strtok

char *strtok(char *restrict s1, const char *restrict s2);

Функція перетворює рядок у послідовність токенів. Токеном називається не порожній рядок символів, які не зустрічаються в рядку s2, за якою слідує символ '\0', символ, що входить в s2. Якщо s1 не є нульовим вказівником, тоді функція починає пошук у рядку s1. В іншому випадку, функція починає пошук рядку, адреса якого була збережена останньою у внутрішньому статичному об'єкті при попередній викликах даної функції.

Функцію strtok () можна використовувати для поділу рядка s на токени. При першому виклику strtok () необхідно вказати перший аргумент s1. В наступних викликах в якості першого аргументу потрібно використовувати NULL. Кожен виклик повертає вказівник на наступний токен, або NULL, якщо токенів більше не виявлено. Якщо фрагмент завершується роздільником, то цей символ листується символом '\0' і вказівник на наступний символ зберігається для наступного виклику strtok (). Розділювачі можуть бути різними при кожному наступному виклику.

strxfrm

size_t strxfrm(char *restrict s1, const char *restrict s2, size_t n);

Функція strxfrm() перетворює перший n символів рядка, що адресується параметром s2, таким чином, щоб її можна було використовувати функцією strcmp (), і поміщає результат в рядок, що адресується параметром s1. Після перетворення результат виклику функції strcmp (), що використовує параметр s1, буде збігатися з результатом виклику функції strcoll (), що використовує вихідну рядок, на яку вказує параметр s2. В масив, що адресується параметром s1, записується не більше count символів.

Друк помилки.

strerror

char *strerror(int errcode);

Функція повертає вказівник на внутрішній статичний об'єкт, що містить рядок повідомлення, що відповідає errcode - код помилки. Програма не повинна змінювати будьякі значення, що зберігаються в цьому об'єкті.

7

Об’єкто – зорієнтоване програмування мовою С++

©Лазорик В.В.

У стандартних файлі заголовку <stdlib.h> та <stdlib.h> описані функцій, які дозволяють перетворювати текстові рядки у числові типи та навпаки.

double atof(const char *s);

Функція atof() перетворює символьний рядок адреса якого знаходиться в аргументі s, в число з подвійною точністю (тип doublе), дана функція розпізнає символьне представлення числа з плаваючою точкою наступного вигляду:

-необов'язкова послідовність табуляції і пробілів;

-необов'язковий знак;

-рядок цифр і необов'язкову десяткову точку (цифри можуть перебувати з обох сторін від точки);

-необов'язкові символи е або E, за якими слідує необов'язкове ціле зі знаком.

Символи повинні відповідати наступним формату:

[Прогалини] [знак] [ddd] [.] [ddd] [e|E[знак]ddd]

Функція atof() також розпізнає + INF і –INF для плюс і мінус нескінченності, + NAN і-NAN для нечислових значень. Ця функція припиняє перетворення на першому нерозпізнаному символі. Функція atof() повертає перетворене значення зазначеної значення символьного рядка. У разі переповнення atof() повертає позитивне або від’ємне значення HUGE_VAL, глобальна ERRNO змінна встановлюється в ERANGE і функція matherr не викликається.

double strtod(const char *restrict s, char **restrict endptr);

long double strtold(const char *restrict s, char **restrict endptr); [added with C99]

Функції strtod() та strtold аналогічні atof(), вона дає краще розпізнавання помилоки, і тому в деяких випадках має перевагу.

int atoi(const char *s); long atol(const char *s);

long long atoll(const char *s); [added with C99]

Функції atoi(),atol() та atoll() перетворюють символьний рядок адреса якого знаходиться в аргументі s, в ціле число типу int, long та long long відповідно. Ця функція розпізнає рядок в такому порядку:

-необов’язковий рядок табуляції і пробілів;

-необов'язковий знак;

-послідовність цифр.

Символи повинні відповідати наступним формату:

[Прогалини] [знак] [ddd]

Ця функція припиняє перетворення на першому при нерозпізнаному символі. Функції повертають перетворене значення вхідного символьного рядка, не відстежують переповнення (результат не визначено). Якщо рядок не може бути перетворений в число відповідного типу, то повертається значення яке дорівнює 0.

long strtol(const char *restrict s, char **restrict endptr, int base);

unsigned long strtoul(const char *restrict s, char **restrict endptr, int base); long long strtoll(const char *restrict s, char **restrict endptr,int base);

unsigned long long strtoull(const char *restrict s, char **restrict endptr, int base); [added with C99]

Функції strtol(),strtoll(),strtoul() та strtoull l() перетворюють символьний

рядок адреса якого знаходиться в аргументі s, в ціле число типу long, long long, unsigned long та unsigned long long відповідно. Параметр base задає базу систему числення, значення може знаходитися в діапазоні від 2 до 36. Якщо параметр base дорівнює 0, перший літера після необов'язкового знака буде визначати базу перетворення. Якщо ця перша літера 0, а друга – не 'х' або 'X', то такий рядок вважається записом восьмеричного числа. Якщо ж перша літера дорівнює 0 ", а друга - 'х' або 'X', то такий рядок буде інтерпретуватися як запис шістнадцяткового числа. Якщо перша літера від '1 'до '9', то рядок інтерпретується як запис десяткового цілого. Букви від A до Z нижнього або верхнього регістрів визначають цифри від 10 до 35 системи числення. Дозволяються тільки ті літери, значення яких менші бази. Якщо коректне значення викликає переповнення, в залежності від знаку повертаються LONG_MAX,

8

Об’єкто – зорієнтоване програмування мовою С++

©Лазорик В.В.

або LONG_MIN, або ULONG_MAX і ERRNO встановлюється в ERANGE. Якщо недопустимі символ зустрічається до дозволених то повертається 0.

char *itoa(int value, char * string, int radix); char *ltoa(long value, char * string, int radix);

char *ultoa(unsigned int value, char * string, int radix);

Функції перетворюють значення value у рядок символів, що закінчується нулем, і записує результат в рядок string. Параметр radix визначає базис, який буде використаний при перетворенні; він повинен лежати між 2 і 36 (включно). Простір, що виділяється для параметра string має бути достатнім, щоб записати отриману в результаті роботи функції, включаючи нульовий байт (\ 0). Функція повертає вказівник на рядок string, причому значення помилково завершення не існує.

Заголовний файл <ctype.h> стандартної бібліотеки мови програмування С, який містить оголошення функцій для класифікації символів.

int isalnum(int c);

Функція перевіряє чи символ є буквою або цифрою. Повертає не нуль, якщо символ є:

a b c d e f g h i j k l m n o p q r s t u v w x y z A B C D E F G H I J K L M N O P Q R S T U V W X Y Z 0 1 2 3 4 5 6 7 8 9

або нуль в противному випадку.

int isalpha(int c);

Функція перевіряє чи символ є буквою. Повертає не нуль, якщо символ є:

a b c d e f g h i j k l m n o p q r s t u v w x y z A B C D E F G H I J K L M N O P Q R S T U V W X Y Z

або нуль в противному випадку

int isblank(int c); [added with C99]

Функція перевіряє чи є пропуском. Повертає не нуль, якщо символ є:

HT space

або нуль в противному випадку

int iscntrl(int c);

Функція перевіряє чи є чи є керуючим символом. Повертає не нуль, якщо символ є:

BEL BS CR FF HT NL VT

або нуль в противному випадку

int isdigit(int c);

Функція перевіряє чи символ є цифрою. Повертає не нуль, якщо символ є:

9

Об’єкто – зорієнтоване програмування мовою С++

©Лазорик В.В.

0

1

2

3 4

5

6 7

8

9

 

або нуль в противному випадку

 

int

isgraph(int

c);

 

Функція перевіряє чи є символ, який має графічне представлення.

int islower(int c);

Функція перевіряє чи символ є буквою нижнього регістру. Повертає не нуль, якщо символ є:

a b c d e f g h i j k l m n o p q r s t u v w x y z

або нуль в противному випадку.

int isprint(int c);

Функція перевіряє чи символ можна надрукувати.

int ispunct(int c);

Функція перевіряє чи є символом пунктуації. Повертає не нуль, якщо символ є:

! " # % & ' ( ) ; < = > ? [ \ ] * + , -

. / : ^ _ { | } ~

або нуль в противному випадку.

isspace

int isspace(int c);

Функція перевіряє чи символ є пропуском. Повертає не нуль, якщо символ є:

CR FF HT NL VT space

або нуль в противному випадку.

int isupper(int c);

Функція перевіряє чи символ є буквою нижнього регістру. Повертає не нуль, якщо символ

є:A B C D E F G H I J K L M N O P Q R S T U V W X Y Z

або нуль в противному випадку.

int isxdigit(int c);

Функція перевіряє чи символ є шістнадцятковим числом. Повертає не нуль, якщо символ є:

0 1 2 3 4 5 6 7 8 9 a b c d e f A B C D E F

або нуль в противному випадку

int tolower(int c);

Функція приводить символ до нижнього регістру.

int toupper(int c);

Функція приводить символ до нижнього регістру.

6. Файли.

Файлом називають спосіб зберігання інформації на фізичному пристрої. Файл - це поняття, яке застосовується до всього - від файлу на диску до терміналу. В C + + відсутні оператори для роботи з файлами. Всі необхідні дії виконуються за допомогою функцій, включених в стандартну бібліотеку. Вони дозволяють працювати з різними пристроями, такими, як диски, принтер, комунікаційні канали і т.д. Ці пристрої сильно відрізняються один від одного. Однак файлова система перетворює їх в єдине абстрактне логічне пристрій, який називається потоком.

Текстовий потік - це послідовність символів. При передачі символів з потоку на екран, частина з них не виводиться (наприклад, символ повернення каретки, переведення рядка).

Двійковий потік - це послідовність байтів, які однозначно відповідають тому, що знаходиться на зовнішньому пристрої.

Організація роботи з файлами засобами C

Для організація роботи з файлами необхідно визначити вказівник на файловий тип.

FILE * ідентифікатор;

Файл відкривається за допомогою fopen, яка повертає через вказівник інформацію про потік введення-виведення, прикріпленого до зазначеного файлу або іншого пристрою, з якого йде читання (або в який йде запис). У разі невдачі функція повертає нульовий вказівник.

10

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]