Lỗi không nhập được input sau khi nhập cin.getline() quá số lượng ký tự

Hi mọi người,

Mình xin hỏi một tình huống dùng cin.getline() bị lỗi sau mà mình chưa tìm được câu trả lời ạ:

#include <iostream>
#include <cstring>
using namespace std;

int main() {
	char name[10];
	cin.getline(name, 10);
	cin.clear();
	cout << name << endl;
	int a;
	cin >> a;
	cout << "Number " << a << endl;
	return 0;
}

Input:

Hello World
1

Output:

Hello Wor
Number 0

Mình đã tìm hiểu thì được biết rằng khi nhập quá số lượng ký tự quy định trong tham số, cả cin.get()cin.getline() dừng việc nhập xuất và các ký tự còn sót lại trong buffer. Tuy nhiên, cin.getline() bật flag failbit và không cho phép tiếp tục nhập input.
Một giải pháp khả thi là dùng cin.clear() để restore input. Ví dụ:

char name1[10], name2[10];
cin.getline(name1, 10);
cin.clear();
cin.getline(name2, 10);
cout << name1 << endl << name2;

sẽ in ra đủ:

Hello Wor
ld

với input là Hello World.

Vì vậy, mình thắc mắc là việc nhập biến int như trên vì sao không khả thi (dù mình có cin.clear()) ạ?

Mình xin cảm ơn.

cin.clear chỉ xoá failbit ở lệnh cin.getline trước gây ra do Hello World lố giới hạn của mảng name. nếu muốn xoá buffer vãn còn thì phải xài thêm cin.ignore

6 Likes

Ồ, em hiểu rồi ạ.
Em xin hỏi thêm là giả sử em vẫn dùng cin.getline() để loại bỏ hết các ký tự thừa trên dòng đó, thì em thêm vòng while sau có ổn không ạ?

char name[10];
cin.getline(name, 10);
cout << name << endl;
while(cin.fail()) {
    cin.clear();
    cin.getline(name, 10);
}
int a; cin >> a;
cout << "Number " << a << endl;
1 Like

cách như vậy được luôn

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