§ 9. Радковыя велічыні

9.1. Увод, вывад, прысвойванне радковых велічынь

З радковым тыпам даных вы пазнаёміліся ў мінулым годзе. У мове С++ таксама ёсць тып даных, які дазваляе працаваць з радковымі велічынямі. Пераменныя радковага тыпу ў С++ апісваюцца тыпам 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), то вынік будзе наступным:

У карыстальніка не будзе магчымасці ўвесці другі радок. У яго будуць счытаны сімвалы, якія засталіся ў буферы пасля ўводу першага радка.

Калі ўзнікае неабходнасць выкарыстаць каманду 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() першы радок будзе пуст.