Computer >> Hướng Dẫn Máy Tính >  >> Lập Trình >> C++

Tại sao std::getline() bỏ qua đầu vào sau trích xuất có định dạng?


std::getline() bỏ qua đầu vào sau một số trích xuất có định dạng. Có thể kiểm tra lỗi này từ mã sau:

Ví dụ mã

#include <iostream>
#include <string>
using namespace std;
int main(){
    string name;
    string city;
    if (cin >> name && getline(cin, city)){
        cout << "Your name " << name << " and city " << city;
    }
}

Kết quả

Amal
Your name Amal and city

Chương trình không nhận đầu vào thứ hai. Đôi khi có thể nhận nhưng chỉ hiển thị đầu vào đầu tiên. Tại sao lại vậy?

Lý do chính: khi nhập chuỗi đầu tiên, ta nhấn Enter. Enter chèn ký tự '\n' sau dòng hiện tại. Ký tự này gây vấn đề, nó bỏ qua phần tiếp theo của chuỗi.

Nếu tên là "Amal", bên trong nó nhận "Amal\n". Để khắc phục, một cách là gọi std::cin.ignore() sau trích xuất đầu tiên. Nó sẽ loại bỏ ký tự tiếp theo, chương trình sẽ chạy tốt.