Заглавная страница Избранные статьи Случайная статья Познавательные статьи Новые добавления Обратная связь FAQ Написать работу КАТЕГОРИИ: ТОП 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; просмотров: 100; Нарушение авторского права страницы; Мы поможем в написании вашей работы! infopedia.su Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав. Обратная связь - 216.73.217.176 (0.005 с.) |