Первая страница
Наша команда
Контакты
О нас

    Головна сторінка



Та програмування

Та програмування




Сторінка7/11
Дата конвертації10.03.2017
Розмір2.35 Mb.
1   2   3   4   5   6   7   8   9   10   11

/* Надрукувати останнє слово в реченні */

#include

void main( )

{

char s,ss; /* s – символ, що вводиться*/



/* ss – попередній уведений символ */

char A[80]; /* масив для слова */

int i,k; /* k – довжина слова */

printf("Напишіть речення з крапкою в "

"кінці:\n");

for (i=0,s=' ',k=0; ³<=79; i )

{

ss=s; s=getchar( );



if (s==' ') continue;

if (s=='.') break.;

if (ss==' ') k=0;

A[k]=s; k ;

}

/*Вихід за крапкою чи після закінчення введення рядка*/

if (і==80 || k=0)

printf(" Неправильне речення \n");

else


{

A[k]='\0'; /* Кінець рядка */

printf("Останнє слово: %s",A) ;

}

} /* Кінець програми */


Читання даних, що вводяться, виконується посимвольно в циклі з параметром. Якщо вводиться пропуск, то оператор continue викликає перехід до наступної ітерації. Якщо введена крапка, то цикл переривається. При цьому в перших k елементах масиву А[] запам'ятовується останнє слово пропозиції.
По́пит і пропози́ція (правильно українською: попит і пропонування) - економічна модель, що описує процес ціноутворення на ринку. Ця модель вводить поняття попиту та пропозиції як універсальні характеристики ринку та доводить, що, за умовами певних припущень, ці характеристики урівноважуються та приводять до встановлення певної ціни на даний товар.
Якщо введений символ відмінний від крапки і пропуску, то аналізується попередній символ. Якщо це пропуск, то починається введення наступного слова і встановлюється нульове значення k. У наступних операторах введений символ записується в k-й елемент масиву А і k збільшується на 1. Вихід з циклу можливий з появою крапки або після введення 80 символів. Останнє виконується при відсутності в реченні крапки. У цьому помилковому випадку і==80. Коли в реченні немає слів, k залишається рівним нулю. Якщо i<80 і k не дорівнює 0, то в k-й елемент масиву А записується ознака кінця рядка (останнього слова речення), і вона як єдине ціле виводиться на друк.

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

Напишіть речення з крапкою в кінці:

Орфографічний словник. Останнє слово: словник


Як ще раз ілюструє наведена програма, робота з символьними рядками – це робота з масивами типу char. При цьому варто звертати увагу на обов'язкову присутність в кінці рядка (в останньому зайнятому елементі масиву) символу '\0' і не допускати його випадкового знищення при обробці.
6.2 Рядки та вказівники

Розглянемо такі два визначення:

char A[20];

/* Масив, у який можна записати рядок */

char *B;


/* Вказівник, з яким можна зв'язати рядок */

Масив А одержує пам'ять автоматично при обробці визначення. Рядку, з яким хочемо зв'язати вказівник В, пам'ять при обробці визначення вказівника не виділяється. Тому якщо далі слідують оператори

scanf("%s",A); /* Оператор правильний */

scanf("%s",B); /* Оператор некоректний */,

то перший з них допустимий, а другий приводить до помилки під час виконання програми – спроба введення в невизначену ділянку пам'яті. До виконання другого з цих операторів введення з вказівником В потрібно пов'язати деяку ділянку пам'яті. Для цього існує кілька можливостей. По-перше, змінній В можна присвоїти адрес вже визначеного символьного масиву. По-друге, вказівник В можна «налаштувати» на ділянку пам'яті, що виділяються за допомогою засобів динамічного розподілу пам’яті.

Наприклад, оператор

B=(char *) malloc(80);

виділяє 80 байтів і пов'язує цей блок пам'яті з вказівником В. Тільки тепер застосування наведеного вище оператора введення припустимо. Прототипи функції malloc() й інших функцій розподілу пам'яті знаходяться у файлі stdlib.h

За допомогою вказівників типу char* зручно одержувати доступ до рядків у вигляді масивів символів. Типова задача – обробка слів чи речень, кожне з яких подано в масиві типу char у вигляді рядка (тобто, в кінці подання речення чи слова знаходиться нуль-символ '\0'). Використання вказівників, а не масивів з фіксованими розмірами, особливо доцільно, коли речення чи слова повинні бути різної довжини. У наступній програмі визначений і при ініціалізації пов'язаний з набором рядків одновимірний масив point[] вказівників типу char*. Функція printf() і специфікатор перетворення %s допускають використання як параметр вказівника на рядок. При цьому на дисплей (у вихідний потік) виводиться не значення вказівника point[і], а вміст адресованого йому рядка.
Текст програми:

#include

void main( )

{

char * point[ ]={"thirteen","fourteen",



"fifteen","sixteen","seventeen","eighteen",

"ninteen"};

int і, n;

n=sizeof(point)/sizeof(point[0]);

for (i=0 ; i

printf("\n%s",point[i]);

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

Thirteen fourteen fifteen sixteen seventeen eighteen

Ninetee
Рядки як параметри функцій

Рядки як фактичні параметри можуть бути специфіковані або як одновимірні масиви типу char[], або як вказівники типу char*. В обох випадках за допомогою параметра в функцію передається адрес початку символьного масиву, що містить рядок. На відміну від звичайних масивів для параметрів рядка немає необхідності явно вказувати їх довжину. Ознака '\0', що розміщується в кінці кожного рядка, дозволяє завжди визначити його довжину, точніше, дозволяє перебирати рядки і не вийти за його межі. Як приклад використання рядка як параметра функцій розглянемо декілька функцій, що розв’язують типові задачі обробки рядків. Аналогії більшості з наведених далі функцій є в бібліотеці стандартних функцій компілятора. Їх прототипи та інші засоби зв’язку з цими функціями знаходяться в заголовних файлах string.h і stdlib.h.


6.3 Стандартні функції для роботи з рядками (бібліотека string.h)
В мові С існують стандартні функції для обробки рядків, які спрощують розробку програм. Ці Функції знаходяться в бібліотеці string.h. Розглянемо основні з них.
Таблиця 6.1 – Основні стандартні функції обробки рядків

Назва

функції


Призначення

Синтаксис

Опис

stpcpy

Копіювати рядок у рядок

char *stpcpy(char *dest,const char *src);

Копіює вихідний рядок src і нуль, що його завершує, у рядок результату dest. Повертає dest strlen(src).

strcat, _fstrcat

Конкатенувати рядок

char *strcat(char *dest, const char *src);

char far *far _fstrcat(char far *dest, const char far *sfc);



Конкатенує (об’єднує) вихідний рядок src і ініціалізований у підсумковий рядок dest, приєднуючи останній до кінця першого. Повертає dest

strchr, _fstrchr

Шукати в рядку символ

char *strchr(const char *s, int c);

char far * far _fstrchr(const char far *s, int c);



Шукає в рядку s перше входження символу c, починаючи з початку рядка. У випадку успіху повертає вказівник на знайдений символ, інакше повертає нуль

strcmp, _fstrcmp

Порівняти рядки

int strcmp(const char *s1, const char *s2);

int far _fstrcmp(const char far *s1, const char far *s2);



Порівнює два рядка. Повертає від’ємне значення, якщо s1 < s2; нуль, якщо s1 == s2; додатнє значення, якщо s1 > s2

strcmpi

Порівняти рядки не розрізняючи малі та великі літери

int strcmpi(const char *s1, const char *s2);

Ця функція аналогічна функції strcmp(), але ігнорує різницю між малими та великими літерами. Для сумісності з іншими компіляторами мови С функція strcmpi() реалізована у вигляді макросу, що безпосередньо викликає функцію strcmpi().

strcpy

Копіювати рядок у рядок

char *strcpy(char *dest,const char *src);

char far * far_fstrcpy(char far*dest, const char far *src);




Копіює вихідний рядок src і нульовий символ, який завершує його, у рядок результату dst, перезаписуючи символи підсумкового рядка, розташовані в місці копіювання. Повертає dest.

strftime

Запам'ятати дату і час у рядку

size_t strftime(char *s, size_t maxsize, const char *fmt const struct tm *t);,

Форматує дату і час у вигляді текстового рядка, використовуючи систему правил перетворення, аналогічну системі printf().

strncpy, _fstrncpy

Копіювати частини рядка

char *strncpy(char *dest, const char *src, size _t maxlen); char far *far _fstrncpy(char far *dest, const char far *src, size _t maxlen);


Копіює максимум maxlen символів із вихідного рядка src у підсумковий рядок dest, перезаписуючи символи підсумкового рядка.

strstr, _fstrstr

Шукати в рядку підрядок

char *strstr (const char *s1, const char *s2); char far *far _ fstrstr (const char far *s1, const char far *s2);

Шукає рядок (s2) в іншому рядку (s1). Повертає адресу першого символу входження рядка або, якщо рядок s2 не знайдений, в рядок s1 повертає нуль.

strtod

Перетворити рядок у число типу double

double strtod (const char *s, char **endptr); long double _strtold(const char *s, char ** endptr);


Перетворює символьне подання числа з плаваючою крапкою у його двійкове подання типу double чи long double. У випадку успіху повертає отриманий при перетворенні результат, а у випадку помилки повертає HUGE_VAL (strtod ())


strtol

Перетворити рядок у довге ціле число

long strtol (const char *s, char **endptr, int radix);

Перетворює символьне подання значення типу long у його двійкове подання. Значення в рядку може бути подано у десятковому, вісімковому чи шістнадцяковому вигляді, що використовує стандартні правила форматування мови С ( що діють для printf( ), scanf() і інших аналогічних функцій).

6.4 Приклади використання стандартних функцій для роботи з рядками


Розглянемо приклади використання основних стандартних функцій для роботи з рядками.

Функція stpcpy()копіює вихідний рядок src і нуль, що його завершує, у рядок результату dest. Повертає dest strlen(src).

Синтаксис: char *stpcpy(char *dest,const char *src);

Параметри:



  • char *dest – вказівник на рядок результату достатньо великого розміру, щоб містити результат.

  • const char *src – вказівник на вихідний рядок, що завершується нульовим символом.

Функція аналогічна strcpy(), strncpy()
Приклад 6.1.

#include

#include

main()


{

char src[80] = "abcdefghij";

char dst[80] = "1234567890";

printf("До: джерело==%s\n",src, dst);

puts("Викликаємо stpcpy(приймач, джерело) ");

stpcpy(dst, src);

printf("Після: джерело==%s приймач==%s\n",src, dst);

return 0;

}

Функція strcat(), fstrcat()конкатенує (об’єднує) вихідний рядок src і ініціалізований підсумковий рядок dest, приєднуючи останній до кінця першого. Повертає dest.( string.h)



Синтаксис: char *strcat(char *dest, const char *src);

char far *far _fstrcat(char far *dest, const char far *sfc);

Параметри:

- char *dest – вказівник на ініціалізований рядок результату.

- const char *destвказівник на вихідний рядок, що приєднується до кінця підсумкового.

Функція аналогічна stpcpy(), strcpy(), strncat()


Приклад 6.2.

#include

#include

main()


{

char src[80] = "abcdefghij";

char dst[80] = "1234567890";

printf("До: джерело ==%s приймач==%s\n", src, dst);

puts("Викликаємо strcat(приймач, джерело)");

strcat(dst, src);

printf("Після: джерело==%s приймач==%s\n", src, dst);

return 0;

}

Функція strchr(), fstrchr()шукає в рядку s перше входження символу c, починаючи з початку рядка. У випадку успіху повертає вказівник на знайдений символ, інакше повертає нуль (string.h).



Синтаксис: char *strchr(const char *s, int c);

char far * far _fstrchr(const char far *s, int c);

Параметри:

- const char *s – вказівник на рядок.



- int c - шуканий символ. Для пошуку нульового символу, що завершує рядок, вкажіть нульове значення.

Функція аналогічна strcspn(), strrchr(), trspn(), strstr()


Приклад 6.3.

#include

#include

main()


{

char src[80] = "abcdefghij";

printf("Рядок у src==%s\n", src);

puts("Викликаємо char *p = strchr(src, 'd')");

char *p = strchr(src, 'd');

printf("Рядок у p == %s\n", p);

return 0;

}

Функція strcmp(), fstrcmp()порівнює два рядки. Повертає від’ємне значення, якщо s1 < s2; нуль, якщо s1 == s2; додатнє значення, якщо s1 > s2 (string.h)



Синтаксис: int strcmp(const char *s1, const char *s2);

int far _fstrcmp(const char far *s1, const char far *s2);

Параметри:

- const char *s1 – вказівник на перший порівнюваний рядок.

- const char *s2 – вказівник на другий порівнюваний рядок.

Функція аналогічна strchr(), strcmpi(), strcol()l, stricmp(), strncmp(), strnicmp()


Приклад 6.4.

#include

#include

#include

main(int argc, char *argv[])

{

char *p;



if (argv <= 2) {

puts("Введіть два рядки");

puts("Наприклад, STRCMP рядокА рядокБ");

exit(1);


}

int result = strcmp(argv[1], argv[2]);

if (result < 0)

p = "менше";

else if (result > 0)

p = "більше";

else

p = "дорівнює";



printf("%s %s %s", argv[1], p, argv[2]);

return 0;

}

Функція strcmpi()ця функція аналогічна функції strcmp(), але вона ігнорує різницю між малими та великими літерами.

Велика літера (заголовна буква) - термін у галузі поліграфічного оформлення і виконання видань та орфографії. Визначає розмір і форму літери.
Для сумісності з іншими компіляторами мови С функція strcmpi() реалізована у вигляді макросу, що безпосередньо викликає функцію strcmpi().


1   2   3   4   5   6   7   8   9   10   11