§ 9. Строковые величины

9.1. Ввод, вывод, присваивание строковых величин

Cо строковым типом данных вы познакомились в прошлом году. В языке С++ тоже есть тип данных, который позволяет работать со строковыми величинами. Переменные строкового типа в С++ описываются типом string (так же, как и в Pascal). Для работы с переменными типа string требуется подключить библиотеку, имя которой совпадает с именем типа: string.

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

string <имя строки>;

Если строка не содержит служебных символов, то ее можно вводить с помощью команды cin. Если в строке содержатся пробелы, или символы табуляции, или другие служебные символы, то в строку будут переданы символы до первого служебного, остальные символы будут проигнорированы. Для ввода строки со служебными символами используют команду

getline(cin, s);

Первый параметр этой команды — имя потока для ввода, а второй — имя переменной, в которую будет записана строка. Ввод заканчивается нажатием клавиши Enter. Символ, соответствующий нажатию этой клавиши, считывается, но к строке не добавляется. Для вывода строк используется команда cout (пример 9.1).

С помощью команды присваивания переменной строкового типа можно присвоить значение. Значение строковой величины записывается в двойных кавычках. Пустая строка задается следующим образом:

s = "";

Запись поясняющего текста при выводе в команде cout является строковой константой. К символам в строке можно обращаться, используя индекс. Нумерация символов начинается с нуля, s[i] соответствует i-му символу в строке s.

Пример 9.1. Введем две строки (с помощью разных команд) и выведем их значения.

#include <iostream>

#include <string>

using namespace std;

 

int main()

{

  string s1, s2;

  cout << "1 stroka" << endl;

  getline(cin, s1);

  cout << "2 stroka" << endl;

  cin >> s2;

  cout << "1 stroka - " << s1 << endl;

  cout << "2 stroka - " << s2 << endl;

  return 0;

}

Тестирование:

В первом случае строка считывается с помощью команды getline, поэтому прочитались и вывелись все символы. Во втором случае считались и вывелись символы до пробела.

Если поменять местами команды вывода (сначала cin, потом getline), то результат будет следующим:

У пользователя не будет возможности ввести вторую строку. В нее будут считаны символы, которые остались в буфере после ввода первой строки.

Если возникает необходимость использовать команду  cin  вводится число, а затем с помощью getline сразу после команды cin, то нужно предварительно очистить буфер данных. Это можно сделать с помощью команды cin.ignore(200,'\n'); Первый параметр указывает, какое максимальное количество символов нужно проигнорировать, пока не встретится символ, указанный в качестве второго параметра.

Команда cin.ignore(); (без параметров) игнорирует символ  '\n'. Это может быть нужно, когда сначала с помощью  cin  вводится число, а затем с помощью getline  считываются строки.

  cin >> n;

  cin.ignore();

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

    getline(cin, s);

    

  }

Без cin.ignore() первая строка будет пустой.