Строка — последовательность символов. Для работы с символами в языке 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.1,табл. 8.2.
| Прототип функции | Описание функции | Пример использования | Результат |
|---|---|---|---|
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 |
| Прототип функции | Описание функции | Пример использования | Результат |
|---|---|---|---|
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 годом!!!".
Кроме работы со строками как с массивом символов, в 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
Разработать программу на языке C++ для следующих заданий, учитывая, что исходная информация хранится в текстовом файле.
Для получения официальных документов о завершении программы дополнительного профессионального образования (удостоверения о повышении квалификации, дипломов о профессиональной переподготовке и MBA) необходимо предоставить:
Внимание! Вы можете не заказывать доставку бумажной версии официального документы, а скачать его в электронном виде и распечатать самостоятельно. Информация о выданном документе в течение 1 месяца загружается в Федеральную информационную систему «Федеральный реестр сведений о документах об образовании и (или) о квалификации, документах об обучении» - ФИС ФРДО.
Доступ на новый сайт осуществляется с использованием адреса электронной почты, который был указан вами при регистрации на "старом". Мы постарались перенести все ваши данные с прежнего ресурса, однако не исключена вероятность потери части информации.
При возникновении проблемы со входом, воспользуйтесь функцией сброса пароля
Если вы обнаружите несоответствия, пожалуйста, сообщите нам.