Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
практичні алгоритмізація дл студ.docx
Скачиваний:
0
Добавлен:
01.04.2025
Размер:
6.12 Mб
Скачать

Лабораторна робота №21. Тема: Покажчики

Мета: Навчитися працювати із покажчиками.

Хід роботи

Програма, приведена на лістингу 8.2, демонструє застосування функцій isalpha, isalnum і isxdigit. Функція isdigit визначає, чи являється її аргумент цифрою (0-9). Функція isalpha визначає, чи потрапляє її аргумент в список букв верхнього (А- Z) або нижнього (а- z) регістрів. Функція isalnum пит визначає приналежність аргументу буквам верхнього і нижнього регістрів або цифрам. Функція isxdigit визначає, чи являється аргумент шістнадцятиричною цифрою (А- F, а- f, 0-9).

1. Прочитайте теоретичні положення. Напишіть програму, на лістингу що нижче, проаналізуйте її.

/*Застосування функцій isdigit, isalpha, isalnum і isxdigit */

#include <stdio.h>

#include <ctype.h>

main ()

{

printf ("%s\n%s%s\n%s%s\n\n", "According to isdigit: ",

isdigit('8')? "8 is a " : "8 is not a ", "digit",

isdigit('#')? "# is a " : "# is not a ", "digit");

printf("%s\n%s%s\n%s%s\n%s%s\n%s%s\n\n"

"Accordingto isalpha :",

isalpha('A')? "A is a " : "A is not a ", "letter",

isalpha('b')? "b is a " : "b is not a ", "letter",

isalpha('&')? "& is a " : "& is not a ", "letter",

isalpha('4')? "4 is a " : "4 is not a ", "letter");

printf ( "%s\n%s%s\n%s%s\n%s%s\n\n", "Accordingto isalnum :",

isalnum('A') ? "A is a " : "A is not a",

"digit or a letter",

isalnum('8')? "8 is a " : "8 is not a

"digit or a letter",

isalnum ('#')? "# is a " : "# is not a

"digit or a letter");

printf ("%s\n%s%s\n%s%s\n%s%s\n%s%s\n%s%s\n"

"Accordingto isxdigit :",

isxdigit('F')? "F is a " : "F is not a

"hexadecimal digit",

isxdigit ('J')? "J is a " : "J is not a

"hexadecimal digit",

isxdigit('7')? "7 is a " : "7 is not a

"hexadecimal digit",

isxdigit('$')? "$ is a " : "$ is not a

"hexadecimal digit",

isxdigit ('f')? "f is a " : "f is not a

"hexadecimal digit");

return 0;

}

According to isdigit:

8 is a digit

is not a digit

According to isalpha:

A is a letter

b is a letter

# is not a letter

4 is not a letter

According to isalnum:

A is a digit or a letter

8 is a digit or a letter

# is not a digit or a letter

According to isxdigit:

F is a hexadecimal digit

J is not a hexadecimal digit

7 is a hexadecimal digit

$ is not a hexadecimal digit

f is a hexadecimal digit

Лістинг 8.2. Примінення isdigit, isalpha, isalnum, isxdigit

Програма на лістингу 8.2 використовує з кожною функцією умовну операцію (?:), щоб визначити, який з рядків " is а " (це) або " is not а " (це не) слід вивести на друк для кожного символу, що перевіряється. Наприклад, вираження

isdigit ('8')? "8 is а": "8 is not а"

означає, що якщо '8' є цифрою, тобто функція isdigit повертає істинне значення (ненульове), то друкується рядок " 8 is а, і, якщо '8' не є цифрою, тобто isdigit повертає 0, друкується рядок " 8 is not а ".

2. Прочитайте теоретичні положення. Напишіть програму, на лістингу що нижче, проаналізуйте її.

Програма, приведена на лістингу 8.3, демонструє застосування функцій islower, isupper, tolower і toupper. Функція islower визначає, чи являється її аргумент буквою нижнього регістра (a - z). Функція isupper визначає, чи являється її аргумент буквою верхнього регістра (A - Z). Функція tolower перетворить регістр букви з верхнього в нижній і повертає букву нижнього регістра. Якщо аргумент не є буквою верхнього регістра, то функція tolo - wer повертає аргумент без змін. Функція toupper перетворить регістр букви з нижнього у верхній і повертає букву верхнього регістра. Якщо аргумент не є буквою нижнього регістра, то функція toupper повертає аргумент без змін.

/* Застосування функцій islower, isupper, tolower, toupper */

#include <stdio.h>

#include <ctype.h>

main ()

{

printf("%s\n%s%s\n%s%s\n%s%s\n%s%s\n\n"

"Accordingto islower :"

islower ('p')? "p is a " : "p is not a

"lowercase letter"

islower ('p')? "p is a " : "p is not a

"lowercase letter"

islower ('5')? "5 is a " : "5 is not a

"lowercase letter"

islower ('!')? "! is a " : "! is - not a

"lowercase letter" ) ; printf("%s\n%s%s\n%s%s\n%s%s\n%s%s\n\n"

"Accordingto isupper :"

isupper ('d')? "D is a " : "D is not an

"uppercase letter"

isupper ('d')? "d is a " : "d is not an

"uppercase letter"

isupper ('8')? "8 is a " : "8 is not an

""uppercase letter"

isupper ('$')? "5 is a " : "$ is not an

"uppercase letter" ); printf ("%s%c\n%s%c\n%s%c\n%s%c\n"

"u converted to uppercase is ", toupper ('u')

"7 converted to uppercase is ", toupper ('7')

"$ "$ converted to uppercase is ", toupper ('$')

"L converted to lowercase is ", tolower ('L'));

return 0;

}

According to islower:

p is a lowercase letter

P is not a lowercase letter

5 is not a lowercase letter

! is not a lowercase letter

According to isupper:

D is an uppercase letter

d is not an uppercase letter

8 is not an uppercase letter

$ is not an uppercase letter

Лабораторна робота №1. Тема: Побудова блок-схем алгоритмів засобами програми Word 2010. 3

Лабораторна робота № 2. Тема: Робота та знайомство в середовищі програмування. Запуск програм на виконання. Редагування тексту. 5

Лабораторна робота №3. Тема: Побудова алгоритмів за допомогою DiagramDesigner. 6

Лабораторна робота №4. Тема:Створення лінійних програм. Процедури вводу та виводу в машинному коді. 8

Лабораторна робота №5. Тема: Написання програм використовуючі математичні функції. Освоєння арифметичних операторів. 10

Лабораторна робота №6. Тема: Написання програм використовуючи логічні значення Boolean. 12

Лабораторна робота №7. Тема: Типи в програмах. 15

Лабораторна робота №8. Тема: Оператор вибору в циклах середовища пргограмування. 17

Лабораторна робота №9. Тема: Використання процедур та функцiй. Звукові можливості Паскаля. 21

Лабораторна робота №10. Тема: Використання перелiчуваного та обмеженого типу даних. 25

Лабораторна робота №11. Тема: Одновимiрнi масиви. 27

Лабораторна робота №12. Тема: Використання множин. 30

ІІ семестр. Мова програмування С 34

Лабораторна робота №13. Тема: Проста програма на С: друк рядка тексту 34

Лабораторна робота №14. Тема: Арифметика в С. Використання операцій рівності і відношення 35

Лабораторна робота №15 . Тема: Структурна розробка програм. Структура вибору if. Структура вибору if/else. Структура повторення while 38

Лабораторна робота №16. Тема: Структурна розробка програм. Структура вибору if. Структура вибору if/else. Структура повторення while 41

Лабораторна робота №17. Тема: Програмні модулі в С. Функції математичної бібліотеки 47

Лабораторна робота №18. Тема: Приклади роботи з масивами 57

Лабораторна робота №19. Тема: Сортування масивів 67

Лабораторна робота №20. Тема: Покажчики 80

Лабораторна робота №21. Тема: Покажчики 97

Лабораторна робота №22. Тема: Форматоване введення/вивід 116

Лабораторна робота №23. Тема: Використання прапорів в рядку управління форматом printf 122

Лабораторна робота №24. Тема: Використання прапорів в рядку управління форматом printf 125

Лабораторна робота №25. Тема: Структури, об′єднання, операції з бітами і перечисленнями 128

Лабораторна робота №26. Тема: Створення файлу послідовного доступу 138

Лістингу 8.3. Застосування islower, isupper, tolower, toupper

3. Прочитайте теоретичні положення. Напишіть програму, на лістингу що нижче, проаналізуйте її.

Лістинг 8.4 ілюструє застосування функцій isspace, iscntrl, ispunct, isprint і isgraph. Функція isspace визначає приналежність аргументу наступному списку пробільних символів : пропуск (' '), нова сторінка ('\f), новий рядок ('\n'), повернення каретки ('\r' ). горизонтальна табуляція ('\t'), вертикальна табуляція ('\v'). Функція iscntrl визначає приналежність аргументу наступному списку символів, що управляють, : горизонтальна табуляція ('\t'), вертикальна табуляція ('\v'), нова сторінка ('\f'), звуковий сигнал ('\а'), повернення на один символ ('\b'), повернення каретки ('\r'), новий рядок ('\n'). Функція ispunct визначає, чи являється аргумент знаком пунктуації або спеціальним символом, що не відноситься до цифр, букв або пропусків, наприклад $ # (, ) [, ],{,}, ;,:, % і так далі. Функція isprint визначає, чи можна відобразити цей символ на екрані (включаючи символ пропуску). Функція isgraph працює так само, як і isprint, але із списку символів виключений символ пропуску.

/* Застосування функцій isspace, iscntrl, ispunct, isprint, isgraph */

#include <stdio.h>

#include <ctype.h>

main ()

{

printf("%s\n%s%%s%s\n%s%s%s\n%s%s\n\n"

"Accordingto isspace :"

"Newline", isspace ('\n')? " is a " : " is not a ",

"whitespace character", "Horizontal tab",

isspace ('\t')? " is a " : " is not a

"whitespace character"

isspace ('%')? "% is a " : "% is not a

"whitespace character");

printf("%s\n%s%s%s\n%s%s\n\n", "Accordingto iscntr1 :"

"Newline", iscntr1 ('\n')? " is a " : " is not a ",

"control character"

iscntr1 ('$')? "$ is a " : "$ is not a

"control character");

printf("%s\n%s%s\n%s%s\n%s%s\n\n", "Accordingto ispunct :",

ispunct ? "; is a " : is not a

"punctuation character"

ispunct ('Y')? "Y is a " : "Y is not a ", "punctuation character"

ispunct ('#')? "# is a " : "# is not a ",

"punctuation character");

printf("%s\n%s%s\n%s%s%s\n\n", "Accordingto isprint :",

isprint ('$') ? "$ is a " : "$ is not a

"printing character"

"Alert", isprint ('\a')? " is a " : "is not a ",

"printing character");

printf("%s\n%s%s\n%s%s%s\n", "Accordingto isgraph :",

isgraph ('Q') ? "Q is a " : "Q is not a

"printing character other than a space"

"Space", isgraph(' ')? " is a " : "is not a ",

"printing character other than a space");

return 0;

}

According to isspace:

Newline is a whitespace character

Horizontal tab is a whitespace character

% is not a whitespace character

According to iscntr1:

Newline is a control character

$ is not a control character

According to ispunct:

; is a punctuation character

Y is not a punctuation character

# is a punctuation character

According to isprint:

$ is a printing character

Alert is not a printing character

According to isgraph:

Q is a printing character other than a space

Space is not a printing character other than a space

Лістинг 8.4. Застосування isspace, iscntrl, ispunct, isprint, isgraph

4. Прочитайте теоретичні положення. Напишіть програму, на лістингу що нижче, проаналізуйте її.

Функції перетворення рядків

Розглянемо функції перетворення рядків з бібліотеки утиліт загального призначення (stdlib). Ці функції перетворять рядки цифр в цілі значення і значення з плаваючою точкою. В таблиці 8.5 приведений перелік функцій перетворення рядків. Зверніть увагу на модифікатор const в описі змінною nPtr в заголовку функції (читається справа наліво: "nPtr є покажчиком на символьну константу"); const оголошує, що значення аргументу не змінюватиметься.

Прототип

Опис функції

double atof (const char *nPtr)

Перетворить рядок nPtr в тип double.

int atoi (const char *nPtr)

Перетворить рядок nPtr в тип int.

long atol (const char *nPtr)

Перетворить рядок nPtr в тип long int.

double strtod (const char *nPtr, char **endPtr)

Перетворить рядок nPtr в тип double.

long strtol (const char *nPtr, char **endPtr, int base)

Перетворить рядок nPtr в тип long.

unsigned long strtoul (const char *nPtr, char **endPtr, int base)

Перетворить рядок nPtr в тип unsigned long.

Таблиця 8.5. Перелік функцій перетворення рядків з бібліотеки утиліт загального призначення

Коли ви викликаєте функції з бібліотеки утиліт загального призначення, підключите заголовний файл <stlib.h>.

5. Прочитайте теоретичні положення. Напишіть програму, на лістингу що нижче, проаналізуйте її.

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

/* Застосування atof */

#include <stdio.h>

#include <stdlib.h>

main ()

{

double d;

d = atof ("99.0");

printf ("%s%.3f\n%s%.3f\n"

"The string \"99.0\" converted to double is ", d

"The converted value divided by 2 is ", d / 2.0);

return 0;

}

The string "99.0" converted to double is 99.000

The converted value divided by 2 is 49.500

Лістинг 8.6. Застосування atof

6. Прочитайте теоретичні положення. Напишіть програму, на лістингу що нижче, проаналізуйте її.

Функція atoi (лістинг 8.7) перетворить аргумент - рядок цифр, який представляє ціле число, - в значення типу int і повертає значення типу int. Якщо аргумент функції не може бути перетворений, то поведінка функції atoi не визначена.

/* Застосування atoi */

#include <stdio.h>

#include <stdlib.h>

main ()

{

int I ;

i = atoi ("2593")

printf("%s%d\n%s%d\n"

"The string \"2593\" converted to int is ", I,

"The converted value minus 593 is ", i - 593);

return 0;

}

The string "2593" converted to int is 2593

The converted value minus 593 is 2000

Лістинг 8.7. Застосування atoi

7. Прочитайте теоретичні положення. Напишіть програму, на лістингу що нижче, проаналізуйте її.

Функція atoi (лістинг 8.8) перетворить аргумент - рядок цифр, який представляє число типу довге ціле, - в значення типу long і повертає значення типу long. Якщо аргумент функції не може бути перетворений, то поведінка функції atol не визначена. Якщо для зберігання типу int і типу long використовуються 4 байти, то функції atoi і atol працюють ідентично.

/* Застосування atol */

#include <stdio.h>

#include <stdlib.h>

main()

{

long 1;

l = atol ("1000000");

printf("%s%ld\n%s%ld\n"

"The string \"1000000\" converted to long int is ", 1,

"The converted value divided by 2 is ", 1 / 2);

return 0;

}

The string "1000000" converted to long int is 1000000

The converted value divided by 2 is 500000

Лістинг 8.8. Застосування atol

8. Прочитайте теоретичні положення. Напишіть програму, на лістингу що нижче, проаналізуйте її.

Функція strtod (лістинг 8.9) перетворить послідовність символів, що представляють число з плаваючою точкою, в значення типу double. Ця функція має два аргументи: рядок (char *) і покажчик рядка. Рядок містить послідовність символів, які мають бути перетворені в тип double. Покажчику привласнюється адреса символу, яка є першим символом рядка-залишку після перетворення частини рядка. Оператор

d = strtod (string, SstringPtr);

з програми лістингу 8.9 означає, що d привласнюється значення типу double, отримане після перетворення рядка string, a stringPtr вказуватиме на перший символ (%) після перетворення значення (51.2) з string.

/* Застосування strtod */

#include <stdio.h>

#include <stdlib.h>

main ()

{

double d;

char *string = "51.2% are admitted";

char *stringPtr;

d = strtod(string, &stringPtr);

printf("The string \"%s\" is converted to the \n",

string);

printf ("double value %.2f and the string \"%s\"\n",

d, stringPtr);

return 0;

}

The string "51.2% are admitted" is converted to the

double value 51.20 and the string "% are admitted"

Лістинг 8.9. Застосування strtod

9. Прочитайте теоретичні положення. Напишіть програму, на лістингу що нижче, проаналізуйте її.

Функція strtol (лістинг 8.10) перетворить послідовність символів, що представляють ціле число, в значення типу long. Ця функція має три аргументи: рядок (char *), покажчик рядка і ціле число. Рядок містить послідовність символів, які мають бути перетворені. Покажчику привласнюється адреса символу, яка є першим символом рядка-залишку після перетворення частини рядка. Ціле число визначає основу, по якій виробляється перетворення. Оператор

х = strtol (string, &remainderPtr, 0);

з програми лістинг 8.10 означає, що х привласнюється значення типу long, отримане після перетворення рядка string. Другий аргумент - remain - derPtr - після перетворення вказуватиме на залишок рядка. Якщо для другого аргументу використовувати значення NULL, то рядок-залишок буде проігнорований. Третій аргумент - 0 - показує, що перетворюване значення може мати вісімковий (основа 8), десятковий (основа 10) або шістнадцятиричний формат (основа 16). Основа може мати значення 0 або може бути будь-яким значенням в діапазоні від 2 до 36. Див. додаток Д, "Системи числення", де детально обговорюється вісімкова, десяткова і шістнадцятирична системи числення. Для чисельного представлення цілих значень від 11 до 35 в діапазоні підстав від 11 до 36 використовуються символи A - Z. Наприклад, шістнадцятиричне число може містити цифри 0-9 і символи A - F. Цілі по основі 11 можуть містити цифри 0-9 і символ А. Цілі по основі 24 можуть містити цифри 0-9 і символи A - N. Цілі по основі 36 можуть містити цифри 0-9 і символи A - Z.

/* Застосування strtol */

#include <stdio.h>

#include <stdlib.h>

main ()

{

long x;

char *string = "-1234567abc", *remainderPtr;

x = strtol(string, &remainderPtr, 0);

printf("%s\"%s\"\n%s%ld\n%s\"%s\"\n%s%ld\n"

"The original string is ", string

"The converted value is ", x

"The remainder of the original string is ",

remainderPtr

"The converted value plus 567 is ", x + 567)

return 0;

}

The original string is "-1234567abc"

The converted value is - 1234567

The remainder of the original string is "abc"

The converted value plus 567 is - 1234000

Лістинг 8.10. Застосування strtol

10. Прочитайте теоретичні положення. Напишіть програму, на лістингу що нижче, проаналізуйте її.

Функція strtoul перетворить послідовність символів, що представляє ціле типу unsigned long, в значення типу unsigned long. Ця функція працює аналогічно функції strtol. Оператор х = strtoul (string, &remainderPtr, 0); з програми лістинг 8.11 означає, що х привласнюється значення unsigned long, отримане після перетворення string. Другий аргумент, &remainderPtr, після перетворення вказує на залишок string. Третій аргумент - 0 - показує, що перетворюване значення може мати вісімковий, десятковий або шістнадцятиричний формат.

/* Застосування strtoul */

#include <stdio.h>

#include <stdlib.h>

main ()

{

unsigned long x;

char *string = "1234567abc", *remainderPtr;

x = strtoul(string, SremainderPtr, 0);

printf("%s\"%s\"\n%s%lu\n%s\"%s\"\n%s%lu\n"

"The original string is ", string

"The converted value is ", x

"The remainder of the original string is ",

remainderPtr

"The converted value minus 567 is ", x - 567);

return 0;

}

The original string is "1234567abc"

The converted value is 1234567

The remainder of the original string is "abc"

The converted value minus 567 is 1234000

Лістинг 8.11. Застосування strtoul

11. Прочитайте теоретичні положення. Напишіть програму, на лістингу що нижче, проаналізуйте її.

Функції стандартної бібліотеки введення/виводу

У цьому розділі представлено декілька функцій із стандартної бібліотеки введення/виводу (stdio), призначені спеціально для операцій з символьними і строковими даними. В таблиці 8.12 приведений перелік функцій введення/виведення символів і рядків із стандартної бібліотеки введення/виводу.

Таблиця

8.12. Символьні і строкові функції стандартної бібліотеки введення/виводу

Прототип

Опис функції

int getchar (void)

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

char *gets (char *s)

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

int putchar (int c)

Друк символу, що зберігається в с.

int puts (const char *s)

Друк рядка s з наступним символом новий рядок.

int sprintf (char *s, const char 'format, ..)

Еквівалент функції printf за винятком того, що результат виводу запам'ятовується в масиві s, а не відображується на екрані.

int sscanf (char *s, const char *format, ..)

Еквівалент функції scanf за винятком того, що введення здійснюється з масиву s, а не з клавіатури.

Якщо ви викликаєте функції із стандартної бібліотеки введення/виводу, підключите заголовний файл <stdio.h>.

9. Прочитайте теоретичні положення. Напишіть програму, на лістингу що нижче, проаналізуйте її.

Програма, приведена на лістингу 8.13, використовує функції gets і putchar для читання рядка тексту із стандартного вхідного пристрою (клавіатури) і рекурсивно виводить символи рядка в зворотному порядку. Функція gets читає символи із стандартного вхідного пристрою і передає їх своєму аргументу - масиву типу char - до тих пір, поки не зустріне символ нового рядка або індикатор кінця файлу. Символ NULL ('\0') додається в масив після закінчення прочитування. Функція putchar друкує свій аргумент - символ. Для друку рядка тексту в зворотному порядку програма лістингу 8.13 викликає рекурсивну функцію reverse. Якщо перший символ масиву, отриманий функцією reverse, є нульовим символом '\0 ', то слідує повернення з функції. Інакше слідує виклик reverse, і її аргумент вказує на адресу "нового" масиву, яка починається з елементу s[1]. Коли рекурсивний виклик завершується, функція putchar виводить елемент s[0]. Порядок дотримання двох операторів в частині else структури if приводить до того, що функція reverse переходить до граничного символу NULL рядка до виведення символу на друк. Як тільки рекурсивний виклик завершується, символи виводяться в зворотному порядку.

/* Застосування gets and putchar */

#include <stdio.h>

main ()

{

char sentence [80];

void reverse(char *);

printf("Enter a line of text:\n");

gets (sentence);

printf("\nThe line printed backwards is:\n");

reverse(sentence);

return 0;

}

void reverse(char *s)

{

if (s [0] == '\0') return;

else {

reverse(&s[1]);

putchar (s[0]);

}

}

Enter a line of text:

Characters and Strings

The line printed backwards is:

sgnirtS dna sretcarahC

Enter a line of text:

able was I ere I saw elba

The line printed backwards is:

able was I ere I saw elba

Лістинг 8.13. Застосування gets and putchar

10. Прочитайте теоретичні положення. Напишіть програму, на лістингу що нижче, проаналізуйте її.

Програма, приведена на лістингу 8.14, використовує функції getchar і puts для читання символів із стандартного вхідного пристрою в символьний масив sentence і виводить масив символів як рядок. Функція getchar читає символ із стандартного вхідного пристрою і повертає його як ціле значення. Функція puts отримує як аргумент рядок (char *) і виводить його з наступним символом нового рядка ('\n').

/* Застосування getchar і puts */

#include <stdio.h>

main ( )

{

char c, sentence [80] ;

int i = 0;

puts ("Enter line of text :");

while ( ( c = getchar() ) != '\n')

sentence[i++] = c;

sentence [i] = ' \0 '; /* вставте символ NULL в кінець рядка */

puts("\nThe line entered was :");

puts(sentence);

return 0;

}

Enter line of text:

This is a test.

The line entered was:

This is a test.

Лістинг 8.14. Застосування getchar and puts

11. Прочитайте теоретичні положення. Напишіть програму, на лістингу що нижче, проаналізуйте її.

Програма припиняє введення символів, коли getchar прочитує введений користувачем символ нового рядка. У масив sentence додається символ NULL, щоб масив міг сприйматися як рядок. Функція puts виводить рядок, що міститься в sentence.

Програма, приведена на лістингу 8.15, використовує функцію sprintf для друку форматованих даних в масив s - масив символів. Ця функція використовує ту ж саму специфікацію перетворення, що і printf (див. главу 9, де детально обговорюються усі можливості форматованого друку). Програма вводить значення типу int і float, які форматуються і виводяться в масив s. Масив s є першим аргументом функції sprintf.

/* Застосування sprintf */

#include <stdio.h>

main ()

{

char s [ 80];

int x;

float y;

printf("Enter an integer and float:\n");

scanf("%d%f", &x, &y);

sprintf(s, "Integer:%6d\nFloat:%8.2f", x, y);

printf ("%s\n%s\n"

"Theformatted output stored in array s :", s);

return 0;

}

Enter an integer and float:

298 87.375

The formatted output stored in array s:

Integer: 298

Float: 87.38

Лістинг 8.15. Застосування sprintf

12. Прочитайте теоретичні положення. Напишіть програми, на лістингах що нижче, проаналізуйте її.

Програма, приведена на лістингу 8.16, демонструє функцію sscanf для читання форматованих даних з масиву символів s. Ця функція використовує ту ж саму специфікацію перетворення, що і scanf. Програма прочитує значення типу int і float з масиву s і запам'ятовує величини відповідно в змінних х і у. Величини х і у виводяться на друк. Масив s є першим аргументом функції sscanf.

Програма застосування sscanf

/* Застосування sscanf */

#include <stdio.h>

main ()

{

char s[] = "31298 87.375";

int x;

float y;

sscanf (s, "%d%f", &x, &y);

printf("%s\n%s%6d\n%s%8,3f\n"

"Thevalues stored in character array s are :"

"Integer:", x, "Float:", y);

{

return 0;

}

The values stored in character array s are:

Integer: 31298

Float: 87.375

Лістинг 8.16. Застосування sscanf

Програма застосування strcpy і strncpy

/* Застосування strcpy і strncpy */

#include <stdio.h>

#include <string.h>

main ()

{

char x[] = "Happy Birthday to You";

char у[25], z[15];

printf ("%s%s\n%s%s\n"

"The string in array x is: ", x

"The string in array у is: ", strcpy (y, x));

strncpy (z, x, 14); z [ 14 ] = '\0' ;

printf ("The string in array z is: %s\n", z);

return 0;

}

The string in array x: Happy Birthday to You

The string in array y: Happy Birthday to You

The string in array z: Happy Birthday

Лістинг 8.18. Застосування strcpy і strncpy

Програма примінення strncat та strcat

/* Застосування strcat і strncat */

#include <stdio.h>

#inciude <string.h>

main ()

{

char s1 [20] = "Happy ";

char s2 [] = "New Year";

char s3 [40] = " ";

printf ("s 1 = %s\ns2 = %s\n", s1, s2);

printf ("strcat (s1, s2) = %s\n", strcat(s1, s2));

printf ("strncat (s3, s1, 6) = %s\n", strncat (s3, s1, 6));

printf ("strcat (s3, s1) = %s\n", strcat(s3, s1));

return 0;

}

s1 = Happy

s2 = New Year

strncat (s1, s2) = Happy New Year

strncat (s3, s1, 6) = Happy

strcat (s3, s1) = Happy Happy New Year

Лістинг 8.19. Примінення strncat та strcat

Програма примінення strcmp і strncmp

/*Применение strcmp і strncmp*/

#include <stdio.h>

#include <string.h>

main ()

{

char *s1 = "Happy New Year";

char *s2 = "Happy New Year";

char *s3 = "Happy Holidays";

printf("%s%s\n%s%s\n%s%s\n\n%s%2d\n%s%2d\n%s%2d\n\n"

"s 1 = ", s1, " s2 = ", s2, "s 3 = ", s3

"strcmp (s1, s2) = ", strcmp(s1, s2)

"strcmp(s1, s3) = ", strcmp (s1, s3)

"strcmp (s3, s1) = ", strcmp (s3, s1));

printf("%s%2d\n%s%2d\n%s%2d\n"

"strncmp(sl, s3, 6) = ", strncmp (s1, s3, 6)

"strncmp (s1, s3, 7) = ", strncmp (s1, s3, 7)

"strncmp(s3, s1, 7) = ", strncmp (s3, s1, 7));

return 0;

}

s1 = Happy New Year

s2 = Happy New Year

s3 = Happy Holidays

strcmp (s1, s2) = 0

strcmp (s1, s3) = 1

strcmp (s3, s1) = - 1

strncmp (s1, s3, 6) = 0

strncmp (s1, s3, 7) = 1

strncmp (s3, s1, 7) = - 1

Лістинг 8.21. Застосування strcmp і strncmp

Програма застосування strchr

/* Застосування strchr */

#include <stdio.h>

#include <string.h>

main ()

(

char *string = "This is a test";

char character1 = 'a ', character2 = 'z';

if (strchr (string, character1)!= NULL)

printf ("\'%c\'was found in \"%s\".\n",

character1, string);

else

printf ("\' %c\' was not found in \"%s\".\n",

character1, string);

if (strchr (string, character2)!= NULL)

printf ("\' %c\' was found in \"%s\".\n", character2, string);

else

printf ("\'%c\' was not found in \"%s\".\n", character2, string);

return 0;

}

''a' was found in "This is a test".

''z' was not found in "This is a test".

Лістинг 8.23. Застосування strchr

13. Прочитайте теоретичні положення. Напишіть програми, на лістингах що нижче, проаналізуйте її.

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

/* Застосування strcspn */

#include <stdio.h>

#include <string.h>

main ()

{

char *string1 = "The value is 3.14159";

char *string2 = "1234567890";

printf("%s%s\n%s%s\n\n%s\n%s%u"

"string 1 = ", string1, "string 2 = ", string2,

"The length of the initial segment of string1",

"containing no characters from string2 = ",

strcspn (string1, string2));

return 0;

}

string1 = The value is 3.14159

string2 = 1234567890

The length of the initial segment of string1

containing no characters from string2 = 13

Лістинг 8.24. Застосування strcspn

14. Прочитайте теоретичні положення. Напишіть програми, на лістингах що нижче, проаналізуйте її.

Функція strpbrk виконує пошук першого входження будь-якого з символів рядка другого аргументу в рядок першого аргументу. Якщо жоден з символів другого аргументу не знайдений, strpbrk повертає NULL. Програма, приведена на лістингу 8.25, виконує пошук в рядку string1 першого по положенню символу, який зустрічається в рядку string2.

/* Застосування strpbrk */

#include <stdio.h>

#include <string.h>

main ()

{

char *string1 = "This is a test";

char *string2 = "beware";

printf("%s\"%s\"\n'%c'%s\n\"%s\"\n"

"Of the characters in ", string2

*strpbrk (string1, string2)

" is the first character to appear in ", string1);

return 0;

}

Of the characters in "beware"

''a' is the first character to appear in

"This is a test"

Лістинг 8.25. Застосування strpbrk

15. Прочитайте теоретичні положення. Напишіть програми, на лістингах що нижче, проаналізуйте її.

Функція strrchr виконує пошук заданого символу в рядку до останнього позитивного результату (останнє входження цього символу в рядок) і повертає покажчик на цей символ. Якщо символ не знайдений, то strrchr повертає NULL. Програма, приведена на лістингу 8.26, викликає strrchr для пошуку останнього з символів 'z ', "A zoo has many animals including zebras", що входять в рядок.

/* Застосування strrchr */

#include <stdio.h>

#include <string.h>

main ()

{

char *string1 = "A zoo has many animals including zebras";

int c = 'z' ;

printf("%s\n%s,%c'%s\"%s\"\n"

"The remainder of string1 beginning with the ",

"last occurrence of character ", c

" is: ", strrchr (string1, c));

return 0;

}

The remainder of string1 beginning with the

last occurrence of character 'z' is: "zebras"

Лістинг 8.26. Застосування strrchr

16. Прочитайте теоретичні положення. Напишіть програми, на лістингах що нижче, проаналізуйте її.

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

/* Застосування strspn */

#include <stdio.h>

#include <string.h>

main ()

{

char *string1 = "The value is 3.14159";

char *string2 = "aehilsTuv";

printf("%s%s\n%s%s\n\n%s\n%s%u"

"string 1 = ", string1, "string 2 = ", string2

"The length of the initial segment of string1",

"containing only characters from string2 = ",

strspn(string1, string2));

return 0;

}

string1 = The value is 3.14159

string2 = aehilsTuv

The length of the initial segment of string1

containing only characters from string2 = 13

Лістинг 8.27. Примінення strspn

17. Прочитайте теоретичні положення. Напишіть програми, на лістингах що нижче, проаналізуйте її.

Функція strstr виконує пошук рядка другого аргументу в рядку першого аргументу до першого позитивного результату (першого входження підрядка в рядок першого аргументу). Якщо другий рядок знайдений в першому рядку, функція повертає покажчик на знайдений підрядок в першому аргументі. Програма, приведена на лістингу 8.28, використовує strstr для пошуку підрядка "def" в рядку "abcdefabcdef".

/* Застосування strstr */

#include <stdio.h>

#include <string.h>

main ()

{

char *string1 = "abcdefabcdef";

char *string2 = "def";

printf ("%s%s\n%s%s\n\n%s\n%s%s\n"

"string 1 = ", string1, "string 2 = ", string2

"The remainder of string1 beginning with the",

"first occurrence of string2 is: ",

strstr(string1, string2));

return 0;

}

string1 = abcdefabcdef

string2 = def

The remainder of string1 beginning with the

first occurrence of string2 is: defabcdef

Лістинг 8.28. Застосування strstr

18. Прочитайте теоретичні положення. Напишіть програми, на лістингах що нижче, проаналізуйте її.

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

Щоб розбити рядок на декілька лексем, потрібно багатократний виклик функції strtok (припускаємо, що рядок містить більше за одну лексему). При першому виклику функція strtok отримує два аргументи: рядок, який треба розбити на лексеми, і рядок, що містить символи, що використовуються для розбиття. У програмі, приведеній на лістингу 8.29, оператор tokenPtr = strtok (string, " ");

привласнює tokenPtr значення покажчика на першу лексему в рядку string. Другий аргумент функції strtok - " - означає, що лексеми в string відділяються пропусками. Функція strtok виконує пошук першого символу в string, який не є розділовим символом (пропуском). З цього символу починається перша лексема. Після цього функція шукає наступний розділовий символ в рядку і замінює його нульовим символом ('\0'). Цей символ завершує поточну лексему. Функція strtok запам'ятовує значення покажчика на символ, що йде відразу за знайденою лексемою, і повертає покажчик на поточну лексему.

/* Застосування strtok */

#include <stdio.h>

#include <string.h>

main ()

{

char string[] = "This is a sentence with 7 tokens";

char *tokenPtr;

printf("%s\n%s\n\n%s\n"

"Thestring to be tokenized is :", string,

"Thetokens are :");

tokenPtr = strtok(string, " ");

while (tokenPtr != NULL){

printf ("%s\n", tokenPtr);

tokenPtr = strtok(NULL, " ");

}

return 0;

}

The string to be tokenized is:

This is a sentence with 7 tokens

The tokens are:

This

is

a

sentence

with

7

tokens

Лістинг 8.29. Застосування strtok

При наступних викликах для продовження розбиття того ж рядка функція strtok отримує як перший аргумент символ NULL. Аргумент NULL показує, що при виклику strtok повинна продовжити розбиття з того місця рядка string, яке було записано при останньому виклику функції. Якщо при черговому виклику strtok виявляється, що лексем вже не залишилося, то функція повертає NULL. Програма, приведена на лістингу 8.29, використовує функцію strtok для розбиття на лексеми рядка "This is a sentence with 7 tokens" ("Ця пропозиція містить 7 лексем"). Кожна лексема друкується окремо. Відмітьте, що strtok модифікує вхідний рядок і, отже, якщо рядок використовуватиметься в програмі після звернення до функції strtok, то слід зробити копію початкового рядка.

19. Прочитайте теоретичні положення. Напишіть програми, на лістингах що нижче, проаналізуйте її.

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

/* Застосування memcpy */

#include <stdio.h>

#include <string.h>

main ()

{

char s1 [22], s2 [ ] = "Copy this string";

memcpy (s1, s2, 17);

printf ("%s\n%s\"%s\"\n"

"After s2 is copied into s1 with memcpy,",

"s1 contains ", s1);

return 0;

}

After s2 is copied into s1 with memcpy,

s1 contains "Copy this string"

Лістинг 8.31. Застосування memcpy

Функція memmove, як і функція memcpy, копіює певне число байтів з об'єкту, на який посилається її другий аргумент, в об'єкт, на який посилається перший аргумент. Спочатку функція копіює задане число байтів з другого аргументу в тимчасовий символьний масив, а потім копіює цей масив в перший аргумент. Такий спосіб дозволяє копіювати символи з однієї частини рядка в іншу частину того ж самого рядка.

20. Прочитайте теоретичні положення. Напишіть програми, на лістингах що нижче, проаналізуйте її.

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

Програма, приведена на лістингу 8.32, використовує функцію memmove для копіювання останніх 10-ти байтів масиву х в перші 10 байтів того ж масиву х.

/* Застосування memmove */

#include <stdio.h>

#include <string.h>

main ()

{

char x [] = "Home Sweet Home";

printf ("%s%s\n"

"The string in array x before memmove is: ", x) ;

printf("%s%s\n"

"The string in array x before memmove is: ",

memmove(x, &x[5], 10));

return 0 ;

}

The string in array x before memmove is: Home Sweet Home

The string in array x before memmove is: Sweet Home Home

21. Прочитайте теоретичні положення. Напишіть програми, на лістингах що нижче, проаналізуйте її.

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

/* Застосування memcmp */

#include <stdio.h>

#include <string.h>

main () {

char s1 [] = "ABCDEFG", s2 [] = "ABCDXYZ";

printf("%s%s\n%s%s\n\n%s%2d\n%s%2d\n%s%2d\n"

"s 1 = ", s1, "s 2 = ", s2

"memcmp (s1, s2, 4) = ", memcmp (s1, s2, 4)

"memcmp (s1, s2, 7) = ", memcmp(s1, s2, 7)

"memcmp (s2, s1, 7) = ", memcmp(s2, s1, 7));

return 0;

}

s1 = ABCDEFG

s2 = ABCDXYZ

memcmp (s1, s2, 4) = 0

memcmp (s1, s2, 7) = - 1

memcmp (s2, s1, 7) = 1

Лістинг 8.33. Застосування memcpy

22. Прочитайте теоретичні положення. Напишіть програми, на лістингах що нижче, проаналізуйте її.

Функція memchr виконує пошук байта (до першого позитивного результату), представленого типом unsigned char, в заданому числі байтів об'єкту. Якщо заданий байт знайдений, функція повертає покажчик на знайдений байт об'єкту. Інакше функція повертає покажчик зі значенням NULL. Програма, приведена на лістингу 8.34, виконує пошук символу (байта) 'r' в рядку "This is a string".

/* Застосування memchr */

#include <stdio.h>

#include <string.h>

main ()

{

char *s = "This is a string";

printf("%s\'%c\'%s\"%s\"\n"

"The remainder of s after character ", 'r',

" is found is ", memchr (s, 'r ', 16));

return 0;

}

The remainder of s after character 'r' is "ring"

Лістинг 8.34. Примінення memchr

23. Прочитайте теоретичні положення. Напишіть програми, на лістингах що нижче, проаналізуйте її.

Функція memset копіює значення байта другого аргументу в певне число байтів об'єкту, на який вказує перший аргумент. Програма, приведена на лістингу 8.35, використовує функцію memset для копіювання 'b' в перші 7 байтів string1.

/* Застосування memset */

#include <stdio.h>

#include <string.h>

main ()

{

char string1 [15] = "BBBBBBBBBBBBBB";

printf("string 1 = %s\n", string1);

printf("string 1 послові memset = %s\n",

memset(string1, 'b ', 7));

return 0;

}

string1 = BBBBBBBBBBBBBB

stringi потім memset = bbbbbbbBBBBBBB

Лістинг 8.35. Застосування memset

24. Прочитайте теоретичні положення. Напишіть програми, на лістингах що нижче, проаналізуйте її.

Функція strlen отримує рядок як аргумент і повертає число символів в рядку (обмежуючий символ NULL в довжину рядка не включений). Програма, приведена на лістингу 8.38, демонструє роботу strlen.

/* Застосування strerror */

#include <stdio.h>

#include <string.h>

main ()

{

printf ( "%s\n", strerror(2));

return 0;

}

Error 2

Лістинг 8.37. Застосування strerror

/* Застосування strlen */

#include <stdio.h>

#include <string.h>

main ()

{

char *string1 = "abcdefghijklmnopqrstuvwxyz" ;

char *string2 = "four";

char *string3 = "Boston";

printf("%s\"%s\"%s%lu\n%s\"%s\"%s%lu\n%s\"%s\"%s%lu\n"

"The length of ", string1, " is ", strlen (string1),

"The length of ", string2, " is ", strlen (string2),

"The length of ", string3, " is ", strlen (string3))

return 0;

}

The length of "abcdefghijklmnopqrstuvwxyz" is 26

The length of "four" is 4

The length of "Boston" is 6

Лістинг 8.38. Застосування strlen