Bắt lỗi của cin khi nhập sai kiểu dữ liệu

Chào các anh/chị, e cần hỏi về việc bắt lỗi trong cin khi nhập sai kiểu dữ liệu, với đoạn code như sau:

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

int main()
{
	int x;
	cout << "Enter a number: ";
	cin >> x;
	while(std::cin.fail()) {
    	cin.clear();
    	cin.ignore(numeric_limits<streamsize>::max(),'\n');
    	cout << "Bad entry.  Enter a NUMBER: ";
    	cin >> x;
    	cout << cin.good();
	}
	std::cout << "x = " << x << std::endl;
	return 0;
}

Với đoạn code như trên thì khi nhập input sai cho x là “fasdfsdf” hoặc “fsdafsdf12323” thì sẽ bắt nhập lại, nhưng khi input là “123213fdffddf” thì không hề có lỗi, cin.good() lúc này trả về 1 và hàm tiếp tục chạy. Cho e hỏi là kiểm soát trường hợp này thế nào?

Cách này không chặn được vì std::istream sẽ đọc đến khi không còn chữ số nào là dừng.

3 Likes

Nếu bạn muốn bắt luôn cả trường hợp “1234abcd” thì có thể làm như vầy:

  • Đọc từ std::cin vào biến tạm std::string
  • Rồi dùng std::stoi để parse và check giá trị pos để đảm bảo là toàn bộ string đều là số valid
4 Likes
83% thành viên diễn đàn không hỏi bài tập, còn bạn thì sao?