Помощничек
Главная | Обратная связь


Археология
Архитектура
Астрономия
Аудит
Биология
Ботаника
Бухгалтерский учёт
Войное дело
Генетика
География
Геология
Дизайн
Искусство
История
Кино
Кулинария
Культура
Литература
Математика
Медицина
Металлургия
Мифология
Музыка
Психология
Религия
Спорт
Строительство
Техника
Транспорт
Туризм
Усадьба
Физика
Фотография
Химия
Экология
Электричество
Электроника
Энергетика

Зауваження до програми. Чому вчить код в лістингу 2?



Чому вчить код в лістингу 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-символьний масив.

Мал. 4. Введення рядка з точки зору cin

 




Поиск по сайту:

©2015-2020 studopedya.ru Все права принадлежат авторам размещенных материалов.