Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Лабораторн_робот_Ч2.doc
Скачиваний:
19
Добавлен:
03.11.2018
Размер:
2.12 Mб
Скачать

Int index(char [ ], char [ ]);

char C2[ ]="ма"/

char C3[ ]="ам";

printf("\nДля %s індекс=%d",C2,index(C1,C2) );

printf("\nДля %s індекс=%d",C3,index(C1,C3)); }

Результат виконання програми:

Для ма індекс=3 Для ам індекс=-1

У функції index() параметри специфіковані як вказівники на тип char, а в тілі функції звертання до символів рядків виконується за допомогою індексованих змінних. Замість параметрів-вказівників підставляють як фактичні параметри імена символьних масивів С1[ ], С2[ ], С3[ ]. Ніякої неточності тут немає: до масивів припустимі обидві форми звертання - і за допомогою індексованих змінних, і з використанням розіменованих вказівників.

Приклад 4. Функція порівняння рядків. Для порівняння двох рядків можна написати наступну функцію (у стандартній бібліотеці мається близька до цієї функція strcmp()):

Int row(char c1[ ], char c2[ ])

{

int і,m1,m2; /* m1,m2 - довжини рядків С1,С2 */

for (m1=0;*(C1+m1)= '\0'; m1++) ;

for (m2=0;*(C2+m2)= '\0'; m2++);

if (m1!=m2) return -1;

for (i=0; i<m1; i++)

if (*C1++ != *C2++) return (i+1);

return 0;

}

У тілі функції звертання до елементів масивів-рядків реалізовано через розіменування вказівників. Функція row() повертає: значення -1, якщо довжини рядків-аргументів С1, С2 різні; 0 - якщо всі символи рядків збігаються. Якщо довжини рядків однакові, але символи не збігаються, то повертається порядковий номер (ліворуч) перших незбіжних символів.

Особливість функції row() - специфікація параметрів як масивів і звертання до елементів масивів всередині тіла функції за допомогою розіменування. При цьому за рахунок операцій С1++ і С2++ змінюються початкові "настроювання" вказівників на масиви. Одночасно в тій же функції до тих же масивів-параметрів виконується звертання і за допомогою виразів *(Cl+m1) і *(С2+m2), при обчисленні яких значення С1 і С2 не міняються.

Приклад 5. Функція з'єднання рядків. Наступна функція дозволяє "приєднати" до першого рядку-аргументу другий рядок-аргумент (у стандартній бібліотеці є подібна функція : strncat()):

/* З'єднання (конкатенація) двох рядків: */

Void cone(char *c1, char *c2)

{

int i,m; /* m - довжина 1-го рядка */

for (m=0; *(C1+m)!='\0'; m++);

for (i=0; *(C2+i)!='\0'; i++)

*(C1+m+i)=*(C2+i);

*(C1+m+і)='\0';

}

Результат повертається як значення першого аргументу C1. Другий аргумент C2 не змінюється. Зверніть увагу на те, що при використанні функції соnс() довжина рядка, що заміняє параметр C1, повинна бути достатньої для прийому результуючого рядка.

Приклад 6. Функція виділення підстроки. Для виділення з рядка С1 фрагмента заданої довжини (підстроки) можна запропонувати таку функцію:

Void substr(char *c1, char *c2, int n, int k)

/* Cl - вихідний рядок */

/* C2 - підстрока, що виділяється */

/* n - початок підстроки, що виділяється */

/* k - довжина підстроки, що виділяється*/

{

int і,m; /* m - довжина вихідного рядка */

for (m=0; C1 [m] ! =' \0 ' ; m++) ;

if (n<0 || n>m || k<0 || k>m-n)

{

C2[0]='\0';

return;

}

for (i=n; i<k+n; i++)

C2[i-n]=C1[i-1];

C2[i-n]='\0';

return;

}

Результат виконання функції - рядок C2 [ ] з k символів, виділених з рядка C1[ ], починаючи із символу, що має номер n. При невірному сполученні значень параметрів повертається порожній рядок, використаний як параметр С2.

Приклад 7. Функція копіювання вмісту рядка. Так як в мові Сі відсутній оператор присвоювання для рядків, то корисно мати спеціальну функцію, що дозволяє "переносити" вміст рядка в інший рядок (така функція strcpy() є в стандартній бібліотеці, але вона має інше значення, що повертається):

/* Копіювання вмісту рядка С2 в С1 */

void copy(char *С1, char *C2) /* С2 - оригінал, С1 - копія */

{

int і;

for (i=0; C2[i]!='\0'; i++)

C1[i]=C2[i];

C1[i]='\0';

}