Довжина рядка - функція strlen ()

Довжина рядка - функція strlen ()

У попередньому розділі ми практично без пояснень використовували операцію sizeof. яка дає нам розмір об'єктів в байтах Функція strlen () дозволяє визначати довжину рядка числом символів. Оскільки для розміщення одного символу в пам'яті відводиться 1 байт, можна було б припустити, що в результаті застосування будь-який з цих двох операцій до одного рядка буде отримано однаковий результат. Виявляється, це не так. Давайте трохи змінимо нашу попередню програму (додамо до неї кілька рядків), і тоді ми зрозуміємо, в чому справа.

#define PRAISE "Ось це так, яке чудове ім'я!"

printf ( "Як вас звуть? n");

printf ( "Привіт,% s.% sn". name, PRAISE);

printf ( "Ваше ім'я складається з. букв і займає. осередків пам'яті. n",

strlen (name), sizeof name);

printf ( "Похвальна фраза складається з. букв", strlen (PRAISE));

printf ( "і займає. осередків пам'яті. n", sizeof PRAISE);

Зауважимо, що випадково ми скористалися двома методами для обробки довгих операторів printf (). У першому випадку ми, записавши один оператор друку в двох рядках програми. Ми зробили це, оскільки дозволяється розбивати рядок між аргументами, але не посередині рядка. В іншому випадку використовувалися два оператора printf () для друку одного рядка; ми вказали символ "новий рядок" (n) тільки в другому з них. Представлений нижче результат роботи даної програми допоможе зрозуміти подібну ситуацію:

Привіт, Перкі. Ось це так, яке чудове ім'я!

Ваше ім'я складається з 5 букв і займає 50 осередків пам'яті.

Похвальна фраза складається з 35 букв і займає 36 осередків пам'яті.

Давайте подивимося, в чому справа. Масив name займає 50 осередків пам'яті, і саме про це повідомляє операція sizeof. Але для зберігання імені Перкі потрібні тільки перші п'ять осередків, і як раз про це нас інформує функція strlen (). У шостий осередку масиву name міститься нуль-символ, і його поява служить сигналом для функції strlen () припинити підрахунок символів

Довжина рядка - функція strlen ()

Рис.4.4. Розпізнавання функцією strlen () кінця рядка

При переході до обробки константи PRAISE виявляється, що функція strlen () знову дає нам точне число символів (включаючи пробіли та знаки пунктуації) в рядку. Результат операції sizeof виявляється на одиницю більшим, оскільки при цьому враховується і "невидимий" нуль-символ, поміщений в кінець рядка. Ми не вказуємо компілятору, який обсяг пам'яті він повинен відвести для розміщення всієї фрази, він сам підраховує число символів між лапками.

Ще одне зауваження в попередньому розділі була використана операція sizeof з дужками, а в цій - без них. Рішення, чи використовувати дужки чи ні, залежить від того, що ви хочете знати обсяг пам'яті, що відводиться під елементи конкретного типу, або обсяг пам'яті, займаний певним об'єктом В першому випадку ви писали б sizeof (char) або sizeof (float). а в другому - sizeof name або sizeof 6.28.