Параметри функції. Способи передачі параметрів 


Мы поможем в написании ваших работ!



ЗНАЕТЕ ЛИ ВЫ?

Параметри функції. Способи передачі параметрів



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 с.)