Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Информатика_и_Пр_Бизнес_лекции.doc
Скачиваний:
84
Добавлен:
10.05.2015
Размер:
1.21 Mб
Скачать

5.3. Ввод строк

Cтроку, не содержащую пробельных символов, можно ввести, используя операцию >> (взять из потока). Например, оператор cin>>s; вводит в строку s символы с клавиатуры. Объект cin считывает в строку символы до первого пробельного символа.

Для ввода в строку текста, в котором встречаются пробелы, символы перехода на новую строку или табуляции в С++ используется функция getline объекта cin.

Синтаксис вызова функции getline:

cin.getline(строка, максимальный размер строки+1, символ-ограничитель строки);

Функция getline считывает из буфера ввода (области оперативной памяти, в которую попадают вводимые с клавиатуры данные до их записи в переменные) символы до символа-ограничителя. Количество считываемых символов не может быть более чем максимальный размер строки. Сам символ-ограничитель в строку не записывается, он удаляется из буфера ввода. В конец строки-переменной добавляется символ ’\0’.

Примеры ввода строки, содержащей пробельные символы:

char s[21];

cin.getline(s,21,’\n’); //вводимые символы ABC ABC ММ 123’\n’

cout<<s; //ABC ABC ММ 123

cin.getline(s,21,’#’); //вводимые символы ABC ABC ММ 123’#’’\n’

cout<<s; //ABC ABC ММ 123

Если в качестве ограничителя используется символ новой строки, то третий аргумент функции getline можно не указывать:

cin.getline(s,21);// вводимые символы ABC ABC ММ 123’\n’

Пример программы, которая подсчитывает количество слов в тексте-предложении, которое заканчивается точкой. В качестве разделителей слов в предложении используются символы пробел и символ новой строки. Максимальная длина текста 200 символов.

#include <iostream.h>

#include <conio.h>

void main( )

{

char s[201]; //строка с текстом

int k=0; //счетчик слов

int i=0; //номер символа

cin.getline(s, 201, '.'); //ввод текста с пробельными символами

//Подсчет символов разделителей слов

while(s[i]!='\0')

{

if(s[i]==' ' || s[i]=='\n')

k++;

i++;

}

if (s[0]!=’\0’) //строка не пустая

k++; //количество слов на 1 больше количества разделителей

cout<<"k="<<k;

getch();

}

Другой способ ввода строки с пробелами – использование функции gets библиотеки stdio языка Си. Функция вводит символы из буфера ввода до символа новой строки и в конец строки-переменной добавляет символ ’\0’. Сам символ новой строки в строку не записывается, он удаляется из буфера ввода.

Пример использования функции gets:

char s[21];

gets(s); //ABC ABC ММ 123’\n’

cout<<s; //ABC ABC ММ 123

5.4. Библиотечные функции для работы с текстом

В стандартных библиотеках языка С++ содержится много полезных функций для работы со строками. Их использование позволяет сократить код программы, увеличить ее надежность, уменьшить время разработки программы. Библиотечные функции приведены в [1, 2]. Все функции рассчитаны на то, что строки заканчиваются нулевым символом. Ниже рассматриваются наиболее востребованные при обработке текста функции.

Функция strlen(s) возвращает текущую длину строки s. Для использования этой функции надо подключить к программе файл string.h.

Пример программы, определяющей является ли введенное слово палиндромом:

#include <iostream.h>

#include <conio.h>

#include <string.h>

void main()

{

char s[21]; //слово

int l, r; //левый и правый символы слова

cin>>s;

cout<<s<<endl;

l=0; //начало слова

r=strlen(s)-1; //конец слова

while(l<r && s[l]==s[r])

{

l++; //индекс левого символа

r--; //индекс правого символа

}

if( l>=r)

cout<<"Yes";

else

cout<<"No" ;

getch();

}

Тесты:

Шалаш палиндром

Тот палиндром

Таня не является палиндромом

АННА палиндром

С палиндром

Функция strcpy(s1,s2) копирует второй аргумент-строку s2 в строку s1. Размер первой строки должен быть не меньше второй, чтобы в нее скопировался 0-символ. Для использования этой функции надо подключить к программе файл string.h.

Пример использования функции:

char s1[21], s2[21];

cout<<s1<<endl; //abc

strcpy(s2,”12345”);

cout<<s2; //12345

Функция strcat(s1,s2) присоединяет к концу первой строки s1 вторую строку s2 и записывает результат в первую строку. Размер первой строки должен быть достаточен, чтобы в нее поместились две сцепленные строки и нулевой символ. Для использования этой функции надо подключить к программе файл string.h.

Пример использования функции:

char s1[10], s2[10];

cin>>s1; //abc

cin>>s2; //def

strcat(s1,s2);

cout<<s1<<endl; //abcdef

Функция strcmp(s1,s2) сравнивает две строки и возвращает число 0, если строки равны, отрицательное число, если строка s1 меньше s2 и положительное число, если строка s1 больше s2. Строки сравниваются лексиграфически (сравниваются коды соответствующих символов строк). Сравнение происходит до первого несовпадающего символа или до конца строк (если все символы строк совпадают). При лексиграфическом сравнении строка “Иванов” меньше строки “Петров”.

Пример программы сортировки по возрастанию массива из n слов (n<=20), максимальная длина слова 15 символов:

#include <iostream.h>

#include <conio.h>

#include <string.h>

void main()

{

char s[20][16]; //массив из 20 строк

char x[16]; //переменная для перестановки слов

int i, j, n; //номер слова и номер прохода

int n; //количество слов

cout<<"n? “;

cin>>n;

cout<<"s? "<<endl;

for (i=0; i<n; i++) //ввод входной строки из нескольких слов ...

cin>>s[i]; // ввод слова

for (j=1; j<n; j++) //сортировка пузырьковым методом

for (i=0; i<n-j; i++)

if(strcmp(s[i],s[i+1])>0) //сравнение слов

{//перестановка слов

strcpy(x,s[i]);

strcpy(s[i],s[i+1]);

strcpy(s[i+1],x);

}

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

cout<<s[i]<<' ';

getch();

}

Тест:

n=4, Иванов Андреев Сидоров Петров

Результат: Андреев Иванов Петров Сидоров