Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
C2013.pdf
Скачиваний:
506
Добавлен:
03.03.2016
Размер:
7.63 Mб
Скачать

Алексеев Е.Р., Чеснокова О.В. Самоучитель по программированию на C/C++.

250

8.Строки в языке С++

8.1Общие сведения о строках в С++

Строка – последовательность символов. Для работы с символами в языке С++ предусмотрен тип данных char. Если в выражении встречается одиночный символ, он

должен быть заключен в одинарные кавычки. При использовании в выражениях строка заключается в двойные кавычки. Признаком конца строки является нулевой символ '\0'. В С++ строки можно описать с помощью массива символов (массив элементов

типа char), в массиве следует предусмотреть место для хранения признака конца стро-

ки ('\0').

 

 

Например,

//Описана строка

из 25 символов.

char s[25];

 

//Элемент s[25] предназначен

 

//для хранения символа конца строки.

char s[7]="Привет";

//Описана строка

из 7 символов

 

//и ей присвоено

значение.

// Определен массив из 3 строк //по 25 байт в каждой.

char m[3][25]={"Пример ", "использования", " строк"}

Для работы со строками можно использовать указатели (char *). Адрес первого

символа будет начальным значением указателя.

 

 

Рассмотрим пример объявления и ввода строк.

 

 

#include <iostream>

 

 

using namespace std;

 

 

int main()

 

 

{

//Описываем 3

строки,

char s2[20], *s3, s4[30];

cout<<"s2=";cin>>s2;

//s3 - указатель.

//Ввод строки

s2.

cout<<"s2="<<s2<<endl;

//Запись в s3

адреса

s3=s4;

 

//строки s4. Теперь в

 

//указателях s3 и s4

cout<<"s3="; cin>>s3;

//хранится один адрес.

//Ввод строки

s3.

cout<<"s3="<<s3<<endl;

//Вывод на экран

s3 и s4,

cout<<"s4="<<s4<<endl;

//s3 и s4 – одно

и тоже.

return 0;

 

 

}

 

 

Если запустить программу на выполнение, то в консольное окно приложения будет аналогичным, приведенному на рис. 8.1.

Алексеев Е.Р., Чеснокова О.В. Самоучитель по программированию на C/C++.

251

Рисунок 8.1. Окно программы ввода-вывода строк

Однако, если во вводимых строках появятся пробелы, программа будет работать не так, как ожидает пользователь (рис. 8.2).

Рисунок 8.2.Окно программы при вводе строк с пробелами

Дело в том, что функция cin вводит строки до встретившегося пробела. Более

универсальной функцией являет функция

cin.getline(char *s, int n);

она предназначена для ввода с клавиатуры строки s с пробелами, в строке не должно быть более n символов. Следовательно, для корректного ввода строк, содержащих пробел, необходимо в нашей программе заменить cin>>s на cin.getline(s,80).

8.2Операции над строками

Строку можно обрабатывать как массив символов, используя алгоритмы обработки массивов, или с помощью специальных функции обработки строк, некоторые из которых приведены в табл. 8.1-8.2.

Таблица 8.1. Функции работы со строками, библиотека string.h

Прототип функции

Описание

 

Пример

Результат

 

функции

 

использования

 

 

 

 

 

size_t strlen(const

Вычисляет длину

char s[80];

s=Hello, Russia!

char *s)

строки s в байтах

cout<<"s=";

s=Hello, Russia!

 

 

 

 

cin.getline(s,80);

Длина строки 14

 

 

 

 

cout<<"s="<<s<<endl

 

 

 

 

 

<<"Длина строки\t"

 

 

 

 

 

<<strlen(s)<<endl;

 

char *strcat(char

Присоединяет

 

char s1[80],s2[80];

s1=Hello,

*dest,

строку

src

в

cout<<"s1=";

s2=Russia!

const char *scr)

конец

строки

cin.getline(s1,80);

s=Hello, Russia!

 

dest,

 

 

cout<<"s2=";

 

 

полученная

 

cin.getline(s2,80);

 

 

строка

 

 

cout<<"s="<<

 

 

возвращается

в

strcat(s1,s2);

 

 

качестве

 

 

 

 

 

результата

 

 

 

Алексеев Е.Р., Чеснокова О.В. Самоучитель по программированию на C/C++.

252

 

 

 

 

 

 

Прототип функции

Описание

 

Пример

Результат

 

 

функции

 

использования

 

 

char *strcpy(char

Копирует строку

char

s1=Hello,Russia!

*dest,

src

в

место

s1[80],s2[80] ;

s2=Hello,Russia!

const char *scr)

памяти,

 

на

cout<<"s1=";

 

 

 

которое

 

 

cin.getline(s1,80);

 

 

 

указывает dest

 

strcpy(s2,s1);

 

 

 

 

 

 

 

cout<<"s2="<<s2;

 

 

char *strncat(char

Присоединяет

 

char s1[80],s2[80];

s1=Hello,

 

*dest,

строку

maxlen

cout<<"s1=";

s2=Russia!

 

const char *dest,

символов строки

cin.getline(s1,80);

s=Hello, Russia

size_t maxlen)

src

в

конец

cout<<"s2=";

 

 

 

строки dest

 

cin.getline(s2,80);

 

 

 

 

 

 

 

cout<<"s="<<

 

 

 

 

 

 

 

strncat(s1,s2,6);

 

 

char *strncpy(char

Копирует

 

 

char

s1=Hello,Russia!

*dest,

maxlen

 

 

s1[80],s2[80] ;

s2=Hello

 

const char *scr,

символов строки

cout<<"s1=";

 

 

size_t maxlen)

src

в

место

cin.getline(s1,80);

 

 

 

памяти,

 

на

strncpy(s2,s1,5);

 

 

 

которое

 

 

cout<<"s2="<<s2;

 

 

 

указывает dest

 

 

 

int strcmp(const

Сравнивает

две

char

s1=RUSSIA

 

char *s1,

строки

 

 

в

s1[80],s2[80] ;

s2=Russia

 

const char *s2)

лексикографичес

cout<<"s1=";

-1

 

 

ком порядке

с

cin.getline(s1,80);

 

 

 

учетом различия

cout<<"s2=";

 

 

 

прописных

 

и

cin.getline(s2,80);

 

 

 

строчных

букв,

cout<<strcmp(s1,s2)

 

 

 

функция

 

 

<<endl;

 

 

 

возвращает

 

0,

 

 

 

 

если

строки

 

 

 

 

совпадают,

 

 

 

 

 

 

возвращает

 

-1,

 

 

 

 

если

 

 

s1

 

 

 

 

располагается

в

 

 

 

 

упорядоченном

 

 

 

 

по

алфавиту

 

 

 

 

порядке раньше,

 

 

 

 

чем s2, и 1 в

 

 

 

 

противоположно

 

 

 

 

м случае.

 

 

 

 

 

int strncmp(const

Сравнивает

 

 

char

s1=Hello,Russia!

char *s1,

maxlen

 

 

s1[80],s2[80] ;

s2=Hello,

 

const char *s2,

символов

двух

cout<<"s1=";

0

 

size_t maxlen)

строк

 

 

в

cin.getline(s1,80);

 

 

 

лексикографичес

cout<<"s2=";

 

 

 

ком

порядке,

cin.getline(s2,80);

 

 

 

функция

 

 

cout<<

 

 

 

возвращает

 

0,

strncmp(s1,s2,6);

 

 

 

если

строки

 

 

 

 

совпадают,

 

 

 

 

 

 

возвращает

 

-1,

 

 

 

 

если

 

 

s1

 

 

 

 

располагается

в

 

 

 

 

упорядоченном

 

 

 

 

по

алфавиту

 

 

 

Алексеев Е.Р., Чеснокова О.В. Самоучитель по программированию на C/C++.

253

 

 

 

 

 

Прототип функции

Описание

Пример

Результат

 

 

функции

использования

 

 

 

порядке

раньше,

 

 

 

 

чем s2, и 1 – в

 

 

 

 

противоположно

 

 

 

 

м случае.

 

 

 

 

Таблица 8.2. Функции работы со строками, библиотека stdlib.h

Прототип функции

Описание

Пример

Результат

 

 

функции

использования

 

 

double atof(const

Преобразует

char a[10];

a=23.57

 

char*s)

строку

 

в

cout<<"a=";

 

 

вещественное

cin>>a;

a=23.57

 

 

число,

в

случае

cout<<"a="<<atof(a)

 

 

неудачного

 

<<endl;

 

 

 

преобразования

 

 

 

 

возвращается

 

 

 

 

число 0.0

 

 

 

 

int atoi(const char*s)

Преобразует

char a[10];

a=23

 

 

строку

в

целое

cout<<"a=";

 

 

число,

в

случае

cin>>a;

a=23

 

 

неудачного

 

cout<<"a="<<atoi(a)

 

 

преобразования

<<endl;

 

 

 

возвращается

 

 

 

 

число 0

 

 

 

 

 

long atol(const char*s)

Преобразует

char a[10];

a=23

 

 

строку в длинное

cout<<"a=";

 

 

целое

число, в

cin>>a;

a=23

 

 

случае

 

 

cout<<"a="<<atol(a)

 

 

неудачного

 

<<endl;

 

 

 

преобразования

 

 

 

 

возвращается

 

 

 

 

число 0

 

 

 

 

 

Для преобразования числа в строку можно воспользоваться функцией sprintf

из библиотеки stdio.h.

sprintf(s, s1, s2);

 

 

 

 

 

Она аналогична описанной ранее функции printf, отличие состоит в том, что

осуществляется вывод не на экран, а в выходную строку s.

 

 

8.3Тип данных string

Кроме работы со строками, как с массивом символов, в C++ существует специальный тип данных string. Для ввода переменных этого типа можно использовать cin50

или специальную функцию:

getline(cin,s);

Здесь s – имя вводимой переменной типа string.

При описании переменной типа string можно сразу присвоить значение этой

переменной.

string var(s);

Здесь var – имя переменной типа string, s – строковая константа. В результате

50 При работе c cin, как отмечалось ранее, ввод осуществляется до пробела.

Алексеев Е.Р., Чеснокова О.В. Самоучитель по программированию на C/C++.

254

этого оператора создается переменная var типа string и в нее записывается значение

из строковой константы s. Например,

string v("Hello");

Создается строка v, в которую записывается значение Hello.

Доступ к i-му элементу строки осуществляется стандартным образом:

имя_строки[номер_элемента];

Над строками типа string определены следующие операции:

присваивания, например s1=s2;

объединение строк (s1+=s2 или s1=s1+s2) – добавляет к строке s1 строку s2, результат хранится в строке s1, например:

#include <iostream> #include <string> using namespace std; int main()

{

string a,b;

cout<<"a="; getline(cin,a); cout<<"b="; getline(cin,b); a+=b;

cout<<"a="<<a<<endl; return 0;

}

сравнение строк на основе лексикографического порядка: s1==s2, s1!=s2, s1<s2, s1<=s2, s1>s2, s1>=s2 – результатом операций сравнения будет ло-

гическое значение;

При обработке строк типа string можно использовать следующие функции51: s.length() – возвращает длину строки s;

s.substr(pos, length) – возвращает подстроку из строки s, начиная с номера pos длиной length символов;

s.empty() – возвращает значение true, если строка s пуста, false – в про-

тивном случае;

s.insert(pos, s1) – вставляет строку s1 в строку s, начиная с позиции pos; s.remove(pos, length) – удаляет из строки s подстроку length длиной

pos символов;

s.find(s1, pos) – возвращает номер первого вхождения строки s1 в строку s, поиск начинается с номера pos, параметр pos может отсутствовать, в этом случае

поиск идет с начала строки;

s.findfirst(s1, pos) – возвращает номер первого вхождения любого символа из строки s1 в строку s, поиск начинается с номера pos, параметр pos может отсутствовать, в этом случае поиск идет с начала строки.

ЗАДАЧА 8.1. Некоторый текст хранится в файле text.txt. Подсчитать количество строк и слов в тексте.

Предлагаем читателю самостоятельно разобраться в приведенном программном

коде. Результаты работы программы показаны на рис. 8.3.

#include <iostream> #include <fstream>

51 В описанных ниже функциях строки s и s1 должны быть типа string.

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]