лекции / Ввод и вывод строк
.docxВвод и вывод строк
//Инициализация во время объявления
string myStr("Это первая строка.");
//Объявление с присваиванием
string myStr = "Это вторая строка.";
//Копирование другой строки (копирующий конструктор)
string myStr(other_Str);
//Создает строку из содержимого строки с завершающим нулем
string myStr(chart_Str);
//Тоже, но определнный длины count
string myStr(chart_Str, count);
//Заполнить count символами ch
string myStr(count, ch);
//Копировать из диапазона [pos, pos+count)
string myStr(othe_Str, pos, count);
//Создание строки с содержимым диапазона [first, last),
//где first и last - InputIterator
string myStr(first, last);
Ниже демонстрируется использование некоторых способов инициализации.
Программа
#include <iostream>
#include <string>
using namespace std;
int main() {
// Получаем C-строку
char S1[] = "Aliena vitia in oculis habemus, a tergo nostra sunt";
//Получаем объект string
string S2(S1, 13, 9);
cout << "S2 => " << S2 << endl;
string S3(S1);
// Получаем итераторы для S3
auto first = S3.begin();
auto last = S3.end();
string S4(first + 13, last - 4);
cout << "S4 => " << S4 << endl;
return 0;
}
S2 => in oculis
S4 => in oculis habemus, a tergo nostra
Примечание. Отдельным символом строку инициализировать нельзя!
Ввод и вывод объектов класса string. Функция getline
Для ввода/вывода строки используются глобальные потоковые объекты cin и cout и операции >> и <<, соответственно.
Если установлен флаг skipws начальные пробелы будут проигнорированы.
В поток будут поступать символы, пока не будет встречен пробельный символ (к ним относятся следующие: собственно пробел, \t, \v, \r, \n и \f) или EOF.
В программе пробельный символ будет расцениваться как нулевое значение (т. е. конец строки) и в строковую переменную будет записана только часть строки, до первого пробела, остальная часть останется на очереди - в потоке.
Такую строку получает переменная myStr в программе 4 (показано на выводе). Произвести сцепку оставшихся слов в потоке можно циклом while. (Смотрите ниже).
Программа
#include <iostream>
#include <string>
using namespace std;
int main() {
string myStr;
cout << "Введите строку состоящую\n"
"из нескольких слов,\n"
"разделенных пробелами:\n";
cin >> myStr;
cout << myStr << endl;
string S;
while (!cin.eof() && cin.get() != '\n') {
cin >> S;
myStr += ' ' + S;
}
cout << myStr << endl;
return 0;
}
//Один два три
Один
Один два три
Чтобы ввести строку полностью, включая пробельные символы, необходимо использовать функцию getline().
Примечание. Не путайте эту глобальную функцию класса string с функцией cin.getline() (методом класса istream), которая обычно применяется для C-строки.
Синтаксис этой функции таков:
getline (istream& is, string& str, char_delim);
Аргументы функции:
is - потоковый объект ввода;
str - объект класса string, куда будет помещена строка;
char_delim - третий аргумент (необязательный) используется для указания завершающего символа. Если третьего аргумента нет, то предполагается, что завершающий символ — '\n'.
Функция считывает строку полностью с завершающим символом. Сам символ новой строки отбрасывается и в строковой переменной не сохраняется.
Также не добавляется нулевой символ. Символ новой строки завершает выполнение функции, где бы он не находился.
Если нулевой символ находится в начале строки, то функция вернет пустую строку. Рассмотрим этот случай:
Программа
#include <iostream>
#include <string>
using namespace std;
int main() {
string S1, S2;
cout << "Введите строку S1\n";
getline(cin, S1);
cout << "#1 " << S1 << endl;
char ch[3];
cout << "ch = "; cin >> ch;
cout << "Введите строку S2\n";
//cin.ignore();
getline(cin, S2);
cout << ch << " " << S2 << endl;
return 0;
}
Введите строку S1
//Это первая строка
#1 Это первая строка
ch = #2
Введите строку S2
#2
После выполнения инструкции: getline(cin, S2); и вывода C-строки программа выводит пустую строку и завершает свою работу.
Причина того, что getline не приняла новую строку в том, что поток ввода оказался не пуст! После ввода С-строки (ch) в потоке остается завершающий символ (после выполнения операции ввода), этот символ и перехватила функция getline. Для очистки потока можно применить функцию cin.ignore() (или cin.get()).
