Trong hàm này mình muốn kiểm tra dữ liệu đầu vào có đúng là float không hay có lẫn ký tự nào vậy nên mình sử dụng hàm cin.fail().Nếu mình nhập vào biến input(cin >> input) mà có ký tự char nào thì nó sẽ báo không nhập được.
Mọi người thấy điều kiện kết thúc vòng lặp nhập input là cin.fail() phải trả về false.Tuy nhiên cin.fail() là một hàm return và nó có trả về một cờ lỗi.Giá trị này không được resert sau khi bạn dùng cin.fail().Do vậy cờ check của mình luôn trả về giá trị fail dẫn đến vòng lặp vô tận.Đồng thời vì cờ của cin.fail() đang trả về true nên nó cũng ngăn cản khả năng vận hành của lệnh cin >> input;
Vậy nên đây là cách khắc phục thêm vào một hàm cin.clear() để reset cờ đồng thời thêm cả cin.ignore() hoặc fflush(stdin) trong thư viện stdio.h để dọn bộ nhớ đệm vì nó vẫn đang chứa giá trị nhập sai từ bàn phim trước đó.
#include <iostream>
#include <stdio.h>
using namespace std;
float nhap_float(float input,float minx,float max)//kiem soat data type,min,max nhap vao
{
bool check;//kiem tra do hop le cua input hop le = true
do
{
check = false;
cin.clear();
cin >> input;
if (cin.fail())
{//du lieu khong hop le
cout << "Khong duoc phep nhap so khong ky tu dac biet\n";
check = false;
}
else //du lieu hop le ktra pham vi gia tri
if (minx <= input and input <max)
{//trong khoang quy dinh
check = true;
cout << "Hop le\n";
}
else //vuot pham vi
{
check = false;
cout << "Ban phai nhap gia tri trong khoang " << minx << " va " << max << endl;
}
fflush(stdin);
//flushall();
//break;
}
while(!check);
return input;//tra ve ket qua hop le
}
Cái nay đang định thắc mắc thì tìm được cách fix luôn mà xóa post thì hơi tiếc nên đăng bài luôn =))