8.2 ФУНКЦІЇ ВВОДУ/ВИВОДУ ПРИ РОБОТІ З РЯДКАМИ

Для вводу і виводу символьних даних у бібліотеці мови С (файл <stdio.h>) визначені наступні функції:

int getchar() - здійснює введення одного символу з вхідного потоку і повертає один байт інформації (символ) у вигляді значення типу int. Це робиться для розпізнавання ситуації, коли при зчитуванні буде досягнуто кінець файлу.

int putchar (int c) – розміщує в стандартний вихідний потік символ c.

Приклад:

# include <stdio.h>

void main()

{char c, d;

c=getchar(); putchar(c);

d=getchar(); putchar(d);

}

char* gets(char*s) – зчитує рядок s із стандартного потоку до появи символу ‘\n’, сам символ ‘\n’ у рядок не заноситься. Повертає вказівник на цей рядок.

int puts(const char* s) – записує рядок у стандартний потік виводу, додаючи в кінці рядка символ ‘\n’, у випадку вдалого завершення повертає значення більше або рівне 0 і від’ємне значення у випадку помилки.

Також для вводу/виводу рядка можна використовувати функції scanf/printf, відповідно, задавши специфікатор формату %s:

# include <stdio.h>

void main(){

const int n=10;

char s[n];

scanf(“%s”, s); printf(“%s”, s);}

Ім’я масиву є вказівником-константою на початок рядка, тому не слід застосовувати операцію взяття адреси (&), що зазвичай використовується з функцією вводу scanf. Ввід буде здійснюватися до першого символу пропуску. Для того щоб ввести рядок, який складається з декількох слів, використовується специфікатор %c (символи) із зазначенням у ньому максимальної кількості символів, що вводяться, наприклад:

scanf(“%10c”, s);

При виводі рядка на екран можна в специфікації %s зазначити кількість символів, які відводяться під рядок:

printf(“%15s”, s);

Функції вводу/виводу мови С++, описані у заголовному файлі <iostream.h>:

cin>>s; //ввід рядка зі стандартного потоку до появи першого пропуску.

При введенні, наприклад, рядка “Ваня Іванов” в рядок s буде записано лише перше слово рядка, а саме “Ваня\0”.

cout<<s; //вивід рядка в стандартний потік до першого пропуску.

Якщо потрібно ввести рядок, який складається з декількох слів, в одну рядкову змінну, використовують методи getline або get класу istream, об’єктом якого є cin. Виклик цього методу здійснюється наступним чином: після імені об’єкту cin ставиться крапка, за якою записується ім’я методу:

#include<iostream.h>

int main()

{const in n=80;

char s[n];

cin.getline(s, n); cout<<s<<endl;

cin.get(s, n); cout<< s}

Метод getline зчитує з вхідного потоку n-1 символів або менше (якщо символ переводу рядка зустрінеться раніше) і записує їх у рядкову змінну s. Символ переводу рядка також зчитується (видаляється) з вхідного потоку, але не записується у рядкову змінну, замість нього розміщується завершальний ’\0’. Якщо в рядку вихідних даних більше за n-1 символів, наступне введення буде виконуватися з того ж рядка, починаючи з першого символу, що не був зчитаний.

Метод get працює аналогічно, але залишає в потоці символ переводу рядка. До рядкової змінної додається завершальний ’\0’.

8.3 СПЕЦІАЛЬНІ ФУНКЦІЇ ДЛЯ РОБОТИ З РЯДКАМИ ТА СИМВОЛАМИ

 

Для рядків не визначено операцій присвоювання, додавання, порівняння, оскільки рядок не є основним типом даних. Для роботи з рядками використовуються спеціальні бібліотечні функції, опис яких міститься у файлі <string.h>. Деякі з цих функцій наведено у таблиці 8.1:

Таблиця 8.1 Функції стандартної бібліотеки для роботи з рядками – файл <string.h>

Прототип функції Короткий опис та використання Пояснення

unsigned strlen(const char*s);

Обчислює довжину рядка s.

strlen(s);

Повертає фактичну довжину рядка, не враховуючи нуль-символ

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

Порівнює рядки s1 і s2.

strcmp(s1, s2);

Якщо s1<s2, тоді результат від’ємний, якщо s1= =s2, тоді результат рівний 0, якщо s2>s1 – результат додатний.

int strncmp(const char*s1, const char *s2, n);

Порівнює перші n символів рядків s1 і s2.

strncmp( s1, s2, n);

Якщо n(s1)<n(s2), тоді результат від’ємний, якщо s1= =s2, тоді результат рівний 0, якщо s2>s1 – результат додатний.

char*strcpy(char*s1, const char*s2);

Копіює символи рядка s2 у рядок s1. strcpy(s1, s2); Нуль-символ при цьому теж включається

char*strncpy(char*s1, const char*s2, int n);

Копіює n символів рядка s2 у рядок s1.

strncpy(s1,s2,n);

Кінець рядка відкидається. Якщо нуль-символ у вихідному рядку зустрінеться раніше, копіювання припиняється, а решта символів рядка доповнюються ‘\0’-ми.

char*strcat(char*s1, const char*s2);

Дописує рядок s2 до рядка s1.

strcat(s1, s2);

Перший символ s2 записується на місце нуль-символу рядка s1. До результуючого s1 додається ‘\0’.

char*strncat(char*s1, const char*s2, size_t n);

Дописуються перші n символів рядка s2 до рядка s1.

strncat(s1,s2,5);

n-символів рядка s2 записується до s1, починаючи з місця нуль-символу s1.

char* strсhr(char*s, int ch)

Шукає символ ch у рядку s.

strchr(s, ch);

Повертає вказівник на перше входження символу в рядок справа. Якщо його немає – повертається NULL

char* strrev(char *s1)

Змінює порядок символів у рядку s1 на протилежний.

strrev(s1, s2);

Дзеркальне відображення рядка s1.

char *strstr(char*s1, char*s2)

Шукає підрядок у рядку.

strstr(s1, s2);

Пошук першого входження s2 у s1. В разі вдалого пошуку повертається вказівник на елемент з s1, з якого починається s2, інакше – NULL.

char *strtok(char*s1, char*s2)

Розбиває рядок на лексеми.

strtok(s1, s2);

Функція повертає вказівник на лексему в s1, відокремлену символом з набору s2 (пробілами або розділовими знаками).

Для роботи з символами у файлі <ctype.h> стандартної бібліотеки визначено функції, наведені в таблиці 8.2:

Таблиця 8.2 Функції стандартної бібліотеки для роботи з символами-файл <ctype.h>

Прототип функції Короткий опис та використання Пояснення

int isalnum(int ch)

Перевіряє чи є символ ch буквою або цифрою (A-Z, a-z, 0-9).

isalnum(ch);

Повертається true, якщо ch є буквою або цифрою, інакше false

int isalpha(int ch)

Перевіряє чи є символ ch буквою (A-Z, a-z). isalpha(ch); Повертається true, якщо ch є буквою, інакше false

int isspace(int ch)

Перевіряє чи є символ ch пропуском (пробіл, табуляція, символ нового рядка, нової сторінки). isspace(ch); Повертається true, якщо ch є узагальненим пробілом, інакше false

int isdigit(int ch)

Перевіряє чи є символ цифрою (0-9).

isdigit(ch);

Повертається true, якщо ch є цифрою, інакше false

int islower(int ch)

Перевіряє чи є символ буквою нижнього регістру (a-z).

islower(ch);

Повертається true, якщо ch є буквою нижнього регістру, інакше false

int isupper(int ch)

Перевіряє чи є символ буквою верхнього регістру (A-Z).

isupper(ch);

Повертається true, якщо ch є буквою верхнього регістру, інакше false

int ispunct(int ch)

Перевіряє чи є символ символом пунктуації (. , : ; ? ! тощо).

ispunct(ch);

Повертається true, якщо ch є символом пунктуації, інакше false

int tolower (int ch)

Повертає символ у нижньому регістрі.

tolower (int ch);

Одержує символ ch і повертає його у нижньому регістрі

int toupper(int ch)

Повертає символ у верхньому регістрі.

toupper(int ch);

Одержує символ ch і повертає його у верхньому регістрі

Приклад 1:

Дано рядок символів, що складається зі слів, слова відокремлені пропусками. Видалити з рядка всі слова, що починаються з цифри.

#include <iostream.h>

#include <string.h>

#include <ctype.h>

void main()

{const int n=250;// розмірність рядкового масиву

char s[n], // вихідний рядок

w[25], // проміжний масив для збереження слова з рядка

*mas[10];// масив вказівників для збереження слів з рядка

cout<<“\nBведiть рядок:\n”;

cin.getline(s, n);

int k=0, t=0, i, len, j;

len=strlen(s);

while(t<len)

{ for(j=0,i=t; isspace(s[i])==0; i++,j++)

w[j]=s[i]; // виокремлюємо слово до пробілу

w[j]=’\0’;// формуємо кінець слова

strcpy(mas[k],w);// копіюємо слово у масив

k++;// збільшуємо лічильник слів у рядку

t=i+1;// перехід через пробіл до наступного слова у

// вихідному рядку s

}

strcpy(s,” ”);// очищуємо вихідний рядок

for(t=0; t<k; t++)// заповнюємо рядок

if(isalpha(mas[t][0])!=0){// якщо перший символ не цифра

{strcat(s,mas[t]);// дописуємо слово в оновлений рядок

strcat(s,” “);// додаємо пробіл після слова

}

cout<<”\nНовий рядок:\n”<< s;// виводимо результат

}

Приклад 2:

Програма яка підраховує скільки разів задане слово зустрічається у тексті файлу. Наприклад, у англійській поговірці “Don’t trouble trouble until trouble troubles you” слово “trouble” у чистому вигляді зустрічається 3 рази.

#include <fstream.h>

#include <string.h>

# include<ctype.h>

void main()

{const int len=81;

char word[len], line [len];// масиви для слова і рядка

cout<< “Введiть слово для пошуку:”; cin>> word;

int_lword=strlen(word);// визначення довжини слова

ifstream fin (“text.txt”, ios:: in | ios:: nocreate);

if(!fin) {cout<< “Помилка відкриття файлу.”<<endl;return 1;}

int count=0;

// поки не досягнуто нуль-символу

while(fin.getline(line, len))

{char *p=line;// вказівникові присвоєно адресу рядка

while(p=strstr(p,word))/* якщо слово знайдено

вказівник стає на позицію

початку слова у рядку*/

{ // адреса початку входження слова передається с

char * c=p;

p+=l_word;// перехід вказівника р через слово

// слово не на початку рядка

if(c!=line)

/* Чи є символ перед словом розділювачем? Інакше –

перейти до наступної ітерації */

if(!ispunct(*(c-2))&& isspace(*(c-1))) continue;

// Чи є символ після слова розділювачем?

if (ispunct(*p)|| isspace(*p)|| (*p==’\0’)) count ++;

}

}

cout << “Слово зустрічається в тексті ”<< count;

<<” разів”<<endl;

}

 



Информация о работе «Мова програмування С++»
Раздел: Информатика, программирование
Количество знаков с пробелами: 62340
Количество таблиц: 10
Количество изображений: 0

Похожие работы

Скачать
206879
0
16

... . Механізм переривань забезпечує ефективна взаємодія пристроїв уведення-висновку з мікропроцесором. Переривання цікавлять нас тому, що обробка переривань - це прерогатива програмування на мові асемблера. У високорівневих мовах відсутні засоби роботи з перериваннями на машинному рівні. Переривання звичайно викликаються зовнішніми пристроями. Переривання сигналізує мікропроцесору, щоб він призупинив ...

Скачать
16544
1
0

... функцій. Щоб полегшити їх роботу, фахівці Microsoft розробили бібліотеку MicrosoftFoundationClasses— MFC . Використовуючи готові класи C++, можна набагато швидше і простіше вирішувати багато задач. Бібліотека MFC істотно полегшує програмування в середовищі Windows. Ті, хто володіє достатнім досвідом програмування на C++, можуть допрацьовувати класи або створювати нові, похідні від існуючих. Класи ...

Скачать
21927
1
4

... , що використовується, прагнути включати в рядок до 10 слів; • прагнути не поміщати більш одного-двох параграфів тексту на один екран. 1.4 Розробка цифрового освітнього ресурсу: «Задачник по мові програмування. Циклічні алгоритми» Назва розробки: електронний навчальний посібник з язика програмування. (Додаток 1) Тип розробки: електронний навчальний посібник. Предмет: інформатика; тема: « ...

Скачать
67862
1
1

... мене основним принципам побудови алгоритмів, програм, вибору структур даних. Ця дисципліна вчить мене думати, надає мені практичних знань та досвіду, щоб розробляти модель програми ще до стадії набору програми на заданій мові програмування. Ця дисципліна вчить мене тим основним речам, без яких жоден представник вибраної мною професії не може обійтись у своїй праці, тим основам, які повинні буди зі ...

0 комментариев


Наверх