Заглавная страница Избранные статьи Случайная статья Познавательные статьи Новые добавления Обратная связь КАТЕГОРИИ: АрхеологияБиология Генетика География Информатика История Логика Маркетинг Математика Менеджмент Механика Педагогика Религия Социология Технологии Физика Философия Финансы Химия Экология ТОП 10 на сайте Приготовление дезинфицирующих растворов различной концентрацииТехника нижней прямой подачи мяча. Франко-прусская война (причины и последствия) Организация работы процедурного кабинета Смысловое и механическое запоминание, их место и роль в усвоении знаний Коммуникативные барьеры и пути их преодоления Обработка изделий медицинского назначения многократного применения Образцы текста публицистического стиля Четыре типа изменения баланса Задачи с ответами для Всероссийской олимпиады по праву Мы поможем в написании ваших работ! ЗНАЕТЕ ЛИ ВЫ?
Влияние общества на человека
Приготовление дезинфицирующих растворов различной концентрации Практические работы по географии для 6 класса Организация работы процедурного кабинета Изменения в неживой природе осенью Уборка процедурного кабинета Сольфеджио. Все правила по сольфеджио Балочные системы. Определение реакций опор и моментов защемления |
Параметри функції. Способи передачі параметрів
1 Рядки та символи Рядок являє собою масив символів, що закінчується нуль-символом. Нуль-символ - це символ з кодом, рівним 0, що записується у вигляді керуючої послідовності '\0'. По положенню нуль-символу визначається фактична довжина рядка. Рядок можна ініціалізувати строковим літералом:
char str[10] = "Vasla"; // виділено 10 елементів з номерами від 0 до 9 // перші елементи - 'V. 'a', 's'. 'i'. 'а', '\0'
У цьому прикладі під рядок виділяється 10 байт, 5 з яких зайняте під символи рядка, а шостий - під нуль-символ. Якщо рядок при визначенні ініціалізується, її розмірність можна опускати (компілятор сам виділить відповідну кількість байт): char str[] = "Vasla": // виділено й заповнено б байт Оператор char *str = "Vasla" створює не строкову змінну, а покажчик на строкову константу, змінити яку неможливо (приміром, оператор str[l]='o' не допускається). Знак рівняння перед строковим літералом означає ініціалізацію, а не присвоювання. Операція присвоювання одного рядка іншої не визначена (оскільки рядок є масивом) і може виконуватися за допомогою циклу або функцій стандартної бібліотеки. Бібліотека надає можливості копіювання, порівняння, об'єднання рядків, пошуку підрядка, визначення довжини рядка й т.д. (можливості бібліотеки описані в розділі «Функції роботи з рядками й символами», с. 91, і в додатку 6), а також містить спеціальні функції введення рядків й окремих символів із клавіатури й з файлу. Приклад. Програма запитує пароль не більше трьох разів.
#include <stdio.h> # include <string.h> int main(){ char s[80], passw[] = "kuku"; // passw - еталонний пароль. // Можна описати як *passw = "kuku"; Int i. k = 0; for (1 = 0;!k && i<3; i++){ printf("\nвведите пароль:\n"); gets(s); // функція введення рядка if (strstr(s,passw))k = 1; // функція порівняння рядків } if (k) printf("\nпароль прийнятий"); else printf("\nпароль не прийнятий"); return 0: }
При роботі з рядками часто використаються покажчики.
УВАГА. Розповсюджені помилки при роботі з рядками — відсутність нуль-символу й вихід покажчика при перегляді рядка за її межі.
Розглянемо процес копіювання рядка src у рядок dest. Очевидний алгоритм має вигляд:
char src[10], dest [10]; … for (int i = 0; i<=strlen(src); i++) dest[i] = src[i];
Довжина рядка визначається за допомогою функції strlen, що обчислює довжину, виконуючи пошук нуль-символу. Таким чином, рядок фактично проглядається двічі. Більше ефективним буде використати перевірку на нуль-символ безпосередньо в програмі. Збільшення індексу можна замінити інкрементом покажчиків (для цього пам'ять під рядок src повинна виділятися динамічно, а також потрібно визначити додатковий покажчик й ініціалізувати його адресою початку рядка dest):
#indude <iostream.h> int main(){ char *src = new char [10]; char *dest = new char [10], *d = dest; cin» src: while (*src!= 0) *d++ = *src++; *d = 0; // завершальний нуль cout «dest: return 0; } У циклі виробляється посимвольне присвоювання елементів рядків з одночасної інкрементаціей покажчиків. Результат операції присвоювання - передане значення, що, властиво, і перевіряється в умові циклу, тому можна поставити присвоювання на місце умови, а перевірку на нерівність нулю опустити (при цьому завершальний нуль копіюється в циклі, і окремого оператора для його присвоювання не потрібно). У результаті цикл копіювання рядка приймає вид: while (*d++ = *src++); Обидва способи роботи з рядками (через масиви або покажчики) прийнятні й мають свої плюси й мінуси, але в загальному випадку краще не винаходити велосипед, а користуватися функціями бібліотеки або певним у стандартній бібліотеці C++ класом string, що забезпечує індексацію, присвоювання, порівняння, додавання, об'єднання рядків і пошук підрядків, а також перетворення з Рядків-з-рядків, тобто масивів типу char, в string, і навпаки (рядка C++ описані в розділі «Рядка» на с. 286). ПРИМІТКА. Рядки string не обов'язково повинні складатися із символів типу char. Це дозволяє використати будь-який набір символів (не тільки ASCII), але для довільного набору варто визначити власну операцію копіювання, що може знизити ефективність роботи.
|
|||||
Последнее изменение этой страницы: 2021-12-15; просмотров: 54; Нарушение авторского права страницы; Мы поможем в написании вашей работы! infopedia.su Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав. Обратная связь - 18.191.135.224 (0.006 с.) |