Программирование на языке C++ в среде Qt Creator

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

Показывать лекцию целиком

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

Строка — последовательность символов. Для работы с символами в языке C++ предусмотрен тип данных char. Если в выражении встречается одиночный символ, он должен быть заключён в одинарные кавычки. При использовании в выражениях строка заключается в двойные кавычки. Признаком конца строки является нулевой символ "\0". В C++ строки можно описать с помощью массива символов (массив элементов типа char), в массиве следует предусмотреть место для хранения признака конца строки ("\0").

Например,

char s [ 25 ]; //Описана строка из 25 символов.
char s [ 15 ]= "Привет"; //Описана строка из 15 символов и ей присвоено значение.
//Определён массив из 3 строк по 30 байт в каждой.
char m[ 3 ] [ 30 ] = { "Пример ", "использования", " строк"}

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

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

#include <iostream>
using namespace std;
int main ( )
{
char s2 [ 2 5 ], *s3, s4 [ 30 ]; //Описываем 3 строки, s3 — указатель.
cout<<"Введите строку:"<<endl;
cout<<" s2 = "; cin>>s2; //Ввод строки s2.
cout<<"Была введена строка:"<<endl;
cout<<" s2 = "<<s2<<endl;
s3=s4; //Запись в s3 адреса строки s4. Теперь в указателях s3 и s4 хранится один адрес.
cout<<"Введите строку:"<<endl;
cout<<" s3 = "; cin>>s 3; //Ввод строки s3.
cout<<"Была введена строка:"<<endl;
cout<<" s3 = "<<s3<<endl; //Вывод на экран s3 и s4,
cout<<"Сформирована новая строка:"<<endl;
cout<<" s4 = "<<s4<<endl; //s3 и s4 — одно и тоже.
return 0;
}

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

Введите строку:
s2=Привет!
Была введена строка:
s2=Привет!
Введите строку:
s3=Программируем?
Была введена строка:
s3=Программируем?
Сформирована новая строка:
s4=Программируем?

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

Введите строку:
s2=Привет, Вася!
Была введена строка:
s2=Привет,
Введите строку:
s3=Была введена строка:
s3=Вася!
Сформирована новая строка:
s4=Вася!

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

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

она предназначена для ввода с клавиатуры строки s с пробелами, причём в строке не должно быть более n символов. Например,

char s [ 25 ];
cout<<"Введите строку:"<<endl;
cout<<" s2 = "; cin.getline ( s, 25 );
cout<<"Была введена строка:"<<endl;
cout<<" s2 = "<<s2<<endl;

Результат:

Введите строку:
s2=Привет, Вася!
Была введена строка:
s2=Привет, Вася!

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

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

Функции работы со строками, библиотека string.h
Прототип функции Описание функции Пример использования Результат
size_t strlen (const char *s) Вычисляет длину строки s в байтах
char s [80];
cout<<"s=";
cin.getline (s,80);
cout<<"s="<<s<<endl
<<"Длина строки\t"<<
strlen(s)<<endl;
s=Hello, Russia!
s=Hello, Russia!
Длина строки 14
char _strcat(char *dest, const char *scr) Присоединяет строку src в конец строки dest, полученная строка возвращается в качестве результата
char s1[80],s2 [80];
cout<<"s1=";
cin.getline (s1,80);
cout<<"s2=";
cin.getline (s2,80);
cout<<"s="<<strcat(s1
,s2);
s1=Hello,
s2=Russia!
s=Hello, Russia!
char *strcpy(char *dest, const char *scr) Копирует строку src в место памяти, на которое указывает dest
char s1[80],s2 [80];
cout<<"s1=";
cin.getline (s1,80);
strcpy(s2,s1);
cout<<"s2="<<s2;
s1=Hello,Russia!
s2=Hello,Russia!
char *strncat(char *dest, const char *src, size_t maxlen) Присоединяет maxlen символов строки src в конец строки dest
char s1[80],s2 [80];
cout<<"s1=";
cin.getline (s1,80);
cout<<"s2=";
cin.getline (s2,80);
cout<<"s="<<strncat(
s1,s2,6);
s1=Hello,
s2=Russia!
s=Hello, Russia
char *strncpy(char *dest, const char *scr, size_t maxlen) Копирует maxlen символов строки src в место памяти, на которое указывает dest
char s1[80],s2 [80];
cout<<"s1=";
cin.getline (s1,80);
strncpy(s2,s1,5);
cout<<"s2="<<s2;
s1=Hello,Russia!
s2=Hello
int strcmp(const char *s1, const char *s2) Сравнивает две строки в лексикографическом порядке с учётом различия прописных и строчных букв, функция возвращает 0, если строки совпадают, возвращает -1, если s1 располагается в упорядоченном по алфавиту порядке раньше, чем s2, и 1 в противоположном случае.
char s1[80],s2 [80];
cout<<"s1=";
cin.getline (s1,80);
cout<<"s2=";
cin.getline (s2,80);
cout<<strcmp(s1,s2)<<
endl;
s1=RUSSIA
s2=Russia
-1
int strncmp(const char *s1, const char *s2, size_t maxlen) Сравнивает maxlen символов двух строк в лексикографическом порядке, функция возвращает 0, если строки совпадают, возвращает -1, если s1 располагается в упо-рядоченном по алфавиту по-рядке раньше, чем s2, и 1 — в противоположном случае.
char s1[80],s2 [80];
cout<<"s1=";
cin.getline (s1,80);
cout<<"s2=";
cin.getline (s2,80);
cout<<strncmp(s1,s2,6)
;
s1=Hello,Russia!
s2=Hello,
0
Функции работы со строками, библиотека stdlib.h
Прототип функции Описание функции Пример использования Результат
double atof(const char*s) Преобразует строку в вещественное число, в случае неудачного преобразова-ния возвращается число 0.0
char a[10];
cout<<"a=";
cin>>a;
cout<<"a="<<atof(a)
<<endl;
a=23.57
a=23.57
int atoi(const char*s Преобразует строку в целое число, в случае неудачного преобразования возвращается число 0
char a[10];
cout<<"a=";
cin>>a;
cout<<"a="<<atoi(a)
<<endl;
a=23
a=23
long atol(const char*s) Преобразует строку в длинное целое число, в случае неудачного преобразования возвращается число 0
char a[10];
cout<<"a=";
cin>>a;
cout<<"a="<<atol(a)
<<endl;
a=23
a=23

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

sprintf(s, s1, s2);

Она аналогична описанной ранее функции printf, отличие состоит в том, что осуществляется вывод не на экран, а в выходную строку s.

Например, в результате работы следующих команд

char str[80];
sprintf (str, "%s %d %s", "С Новым ", 2014, "годом!!!");

в переменную str будет записана строка "С Новым 2014 годом!!!".

8.3 Тип данных string

Кроме работы со строками как с массивом символов, в При работе c командой cin, как отмечалось ранее, ввод осуществляется до пробела или специальную функцию:

getline(cin,s);

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

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

string имя_переменной(s);

Здесь имя_переменной — идентификатор типа 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 ( )
    {
    	stringa, 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 можно использовать следующие функцииВ описанных ниже функциях строки s и s1 должны быть типа string.:

  • 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. Подсчитать количество строк и слов в тексте.

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

    #include <iostream>
    #include <fstream>
    #include < std lib .h>
    #include <iomanip>
    using namespace std;
    int main ( )
    {
    	ifstream f;
    	int p, j, i, kol,m, n=0;
    	stringS [ 10 ];
    	f.open ( " text.txt " );
    	if ( f )
    	{
    		while ( ! F.eof ( ) )
    		{
    			getline ( f, S [ n ] );
    			cout<<S [ n]<<" \n ";
    			n++;
    		}
    		f.close ( );
    		cout<<endl;
    		cout<<"Количество строк в тексте - "<<n<<endl;
    		for ( kol =0, i =0; i<n; i++)
    		{
    			m=S [ i ].length( );
    			S [ i ]+=" ";
    			for ( p=0;p<m; )
    			{
    				j=S [ i ].find ( " ", p );
    				if ( j !=0) { kol++; p=j +1;}
    				else break;
    			}
    		}
    	cout<<"Количество слов в тексте - "<<kol<<endl;
    	}
    	else cout<<"Файл не найден"<<endl;
    	return 0;
    }

    Результаты работы программы:

    Если видим, что с картины
    Смотрит кто-нибудь на нас,
    Или принц в плаще старинном,
    Или в робе верхолаз,
    Лётчик или балерина,
    Или Колька, твой сосед,
    Обязательно картина
    Называется портрет.
    
    Количество строк в тексте - 8
    Количество слов в тексте - 29

    8.4 Задачи для самостоятельного решения

    Разработать программу на языке C++ для следующих заданий, учитывая, что исходная информация хранится в текстовом файле.

  • Подсчитать количество слов в каждой строке текста.
  • Подсчитать количество символов в тексте.
  • Подсчитать количество точек в тексте.
  • Подсчитать количество пробелов в тексте.
  • Удалить из теста все пробелы.
  • Удалить из теста все точки.
  • Вставить вместо каждого пробела восклицательный знак.
  • Вставить перед каждым восклицательным знаком вопросительный.
  • Определить, содержит ли текст хотя бы один восклицательный знак, и в какой строке.
  • Подсчитать количество слов в чётных строках текста.
  • Найти номер самой длинной строки текста.
  • Променять местами первую и последнюю строки текста.
  • Определить, есть ли в тексте пустые строки.
  • Определить, содержит ли текст хотя бы пару соседних одинаковых строк.
  • Найти самую короткую строку текста и заменить её фразой "С новым годом!".
  • Найти самую длинную строку текста и заменить её пустой строкой.
  • Определить количество слов в нечётных строках текста.
  • Определить количество пробелов в чётных строках текста.
  • Определить количество предложений в тексте, учитывая, что предложение заканчивается точкой, вопросительным или восклицательным знаком.
  • Поменять местами самую длинную и самую короткую строки текста.
  • Вывести на печать первое предложение текста, учитывая, что оно заканчивается точкой.
  • Определить количество пробелов в нечётных строках текста.
  • Удалить из теста все восклицательные и вопросительные знаки.
  • Определить, содержит ли текст хотя бы один вопросительный знак, и в какой строке.
  • Добавить в начало каждой строки текста её номер и пробел.
  • Вернуться к учебному плану