Đọc string bằng cin và getline() dẫn đến việc xuất ra hai output khác nhau

Cho mình hỏi vấn đề về chuỗi:

Đây là code mình dùng để nhập chuỗi cho 2 biến “name_a” và “name_b”:

    #include "iostream"
    #include "string.h"
    using namespace std;

    int main()
    {
        char name_a[100];
        cout << "Write name a: ";
        cin.getline(name_a,100);
        cout << "Name a: " << name_a << endl;
        string name_b;
        cout << "Write name b: ";
        getline (cin,name_b);
       cout << "Name b: " << name_b << endl;
       return 0;
    }

Thì output xuất ra như sau:

Write name a: Thanh Tai
Name a: Thanh Tai
Write name b: Quang Minh
Name b: Quang Minh

Nhưng nếu mình thay dòng code cin.getline(name_a,100) thành cin << name_a như sau:

    #include "iostream"
    #include "string.h"
    using namespace std;

    int main()
    {
       char name_a[100];
        cout << "Write name a: ";
        //cin.getline(name_a,100);
        cin  >> name_a;
        cout << "Name a: " << name_a << endl;
        string name_b;
       cout << "Write name b: ";
       getline (cin,name_b);
       cout << "Name b: " << name_b << endl;
       return 0;
    }

Thì output xuất ra sẽ bị lỗi như thế này:

Write name a: Thanh Tai
Name a: Thanh
Write name b: Name b:  Tai

Mình không hiểu sự khác biệt trong việc dùng cingetline() cho chuỗi string như thế nào lại dẫn đến việc xuất ra hai output khác nhau?

Do lệnh cin không nhận ký tự ‘\n’ khi nhấn Enter
còn getline sẽ kết thúc khi nhận ký tự ‘\n’.
Vì thế khi chạy name_b sẽ tự kêt thúc.
có thể khắc phục bằng cách sài cin.ignore(100,’\n’) dưới cin >> name_a để bỏ ‘\n’ đi.

4 Likes

Cin sẽ nhận ký tự khoảng trống làm dấu hiệu kết thúc việc nhập nên khi muốn input string có khoảng trống thường dùng cin.getline

2 Likes
83% thành viên diễn đàn không hỏi bài tập, còn bạn thì sao?