Вперед Зміст

Ввід

Для введення даних у рядок будемо використовувати функцію getline(). Ця функція дозволяє зчитувати рядок повністю, включаючи символи пробілів, і зберігати її в змінній типу string.

Оператор getline(cin,s) читає рядок зі стандартного потоку вводу (cin) та зберігає його у змінній s.

Ввід виконується включаючи і символ "кінець рядку", який виводиться у буфер при натисканні клавіші Enter.

Для вводу двох рядків потрібно використовувати дві функції getline().

Наприклад:


#include <iostream>
#include <string>
using namespace std;
int main()
{
  setlocale(0,"");
  string s1,s2;
  getline(cin,s1);
  getline (cin,s2);
  cout<<s1<<"   "<<s2;
  return 0;
}

Консоль


mama mila ramu
123  456
mama mila ramu   123  456

Що таке буфер вводу

Буфер введення (input buffer) - це тимчасова пам'ять, яка використовується для зберігання даних, які були введені користувачем з клавіатури та очікують на обробку програмою.

Коли ви вводите дані з клавіатури за допомогою функцій введення (наприклад, cin ), ці дані спочатку поміщаються в буфер введення, а потім зчитуються з нього програмою обробки.

Дані, які були зчитані з буфера і присвоєні змінній, видаляються з буфера. Ті дані, які не були зчитані та присвоєні змінній, залишаються у буфері.

Одночасне використання функцій cin та getline

Функція cin залишає в буфері останній символ кінця рядка '\n', який виводиться в буфер при натисканні клавіші Enter. Повторне використання функції cin не впливає на результат, оскільки вона пропускає ці символи.

Функція getline вводить всі символи, включаючи і кінець рядка теж. Тому, якщо ця функція використовується після cin, вона відразу зчитує символ кінця рядка '\n', який залишився в буфері після cin і присвоює значення порожнього рядка змінної в getline.

Тому, при одночасном використанні функцій cin та getline, після cin потрібно використовувати функцію cin.ignore(1, '\n'), яка ігнорує цей 1 символ, який залишився в буфері після cin

Наприклад:


#include <iostream>
#include <string>
using namespace std;
int main()
{
    char c;  string str;
    cin>>c;
    //ігнорувати 1 символ кінця рядку
    cin.ignore(1, '\n');
    getline(cin,str);
    cout<<c<<"   "<<str;
    return 0;
}

Консоль


*
mama mila ramu
* mama mila ramu

Для повного ігнорування всіх символів, що залишилися в буфері, можна використовувати функцію з більш складними параметрами:


#include <iostream>
#include <string>
#include <limits>
using namespace std;
int main()
{
    char c;  string str;
    cin>>c;
    // игнорирование всех символов из буфера
    cin.ignore(numeric_limits::max(), '\n');
    getline(cin,str);
    cout<<c<<"   "<<str;
    return 0;
}

Якщо ми введемо так:


qwerty
abcdef

То отримаємо результат:


q  abcdef

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

Функція cin.ignore(numeric_limits<streamsize>::max(), '\n') ігнорує їх усі. Але для використання функції з такими параметрами, потрібно додати #include <limits>

Вперед Зміст