Чому вчить код в лістингу 2? Спершу, зверніть увагу, що операція sizeof повертає розмір всього масиву - 15 байт, але функція strlen() повертає розмір рядка, що зберігається в масиві, а не розмір самого масиву. До того ж strlen() підраховує тільки видимі символи, без нульового символу-обмежувача. Тобто ця функція повертає як довжини Basicman значення 8, а не 9. Якщо cosmic - рядок, то мінімальний розмір масиву для розміщення цього рядка обчислюється як strlen(cosmic)+1.
Оскільки name1 і name2 - масиви, для доступу до окремих символів в цих масивах можна використовувати індекси. Наприклад, у програмі для пошуку першого символу масиву name1 застосовується name1[0]. Крім того, програма присвоює елементу name2[3] нульовий символ. Це завершує рядок після трьох символів, хоча в масиві залишаються ще символи (мал. 3).
Мал. 3. Скорочення рядка за допомогою \0
Зверніть увагу, що в програмі з лістингу 2 для вказівки розміру масива використовується символьна константа. Часто розмір масиву потрібно вказувати в декількох операторах програми. Застосування символьних констант для представлення розміру масиву спрощує внесення змін, пов'язаних з довжиною масива; в таких випадках змінити розмір буде потрібно тільки в одному місці - там, де визначена символьна константа.
Ризики, пов'язані з введенням рядків
Програма string.срр має недолік, прихований за часто використовуваною в літературі технікою ретельного вибору прикладів введення. У лістингу 3 продемонстровано той факт, що введення рядків може виявитися непростим.
Лістинг 3. insrtl.cpp
Призначення програми з лістингу 3 просте: прочитати ім'я користувача і назву його улюбленого десерту, введені з клавіатури, і потім відобразити цю інформацію.
Нижче наведено приклад запуску:
Ми навіть не отримали можливості відповісти на питання про десерт! Програма показала питання і потім негайно перейшла до відображення заключного рядка.
Проблема пов'язана з тим, як cin визначає, коли введення рядка завершено. Ви не можете ввести нульовий символ з клавіатури, тому cin потрібно щось інше для знаходження кінця рядка. Підхід, прийнятий в cin, полягає у використанні пробільних символів для розділення рядків - пробілів, знаків табуляції і символів нового рядка. Це означає, що cin читає тільки одне слово, коли отримує вввведення для символьного масиву. Після читання слова cin автоматично додає обмежуючий нульовий символ при вставці рядка в масив.
Практичний результат цього прикладу полягає в тому, що cin читає слово Alistair як повний перший рядок і поміщає його в масив name. При цьому друге слово, Dreeb, залишається у вхідній черзі. Коли cin шукає введення, що відповідає на питання про десерт, він знаходить там Dreeb. Потім cin захоплює слово Dreeb і поміщає його в масив dessert (мал. 4).
Ще одна проблема, яка не була виявлена в прикладі запуску, полягає в тому, що запроваджуваний рядок, у свою чергу, може бути довше, ніж цільовиї масив. При такому використанні cin, як це зроблено в прикладі, немає ніякого захисту від вставки 30-символьного рядка в 20-символьний масив.