30/09/2018, 19:58

Chương trình quản lý sinh viên sử dụng class lỗi không dừng lại để nhập mã số sinh viên?

Mình viết chương trình nhập n sinh viên sử dụng class. Ở hàm nhập sinh viên mình đã gọi hàm fflush(stdin) để xóa bộ nhớ đệm rồi mà lúc chạy chương trình vẫn không dừng lại để nhập mã số sinh viên là sao ???


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

class Candidate 
{
private:
	string mssv, hoten;
	int ngay, thang, nam;
	float toan, van, anh;
public:
	void nhap();
	void xuat();
};

void Candidate::nhap()
{
	fflush(stdin);
	cout << "
Nhap ma so sinh vien : ";
	getline(cin, mssv);

	fflush(stdin);
	cout << "
Nhap ten sinh vien : ";
	getline(cin, hoten);

	cout << "
Ngay sinh : ";
	cin >> ngay;
	cout << "
Thang : ";
	cin >> thang;
	cout << "
Nhap nam: ";
	cin >> nam;

	cout << "
Toan : ";
	cin >> toan;
	cout << "
Anh : ";
	cin >> anh;
	cout << "
Van : ";
	cin >> van;
}
 
void Candidate::xuat()

{
	cout << "
Ma so : " << mssv;
	cout << "
Ho ten : " << hoten;
	cout << "
Ngay sinh : ngay " << ngay << " thang " << thang << " nam " << nam;
	cout << "
Toan : " << toan << " diem";
	cout << "
Anh : " << anh << " diem";
	cout << "
Van : " << van << " diem";
}

int main()
{	 
	Candidate *sv;
	int n;
	cout << "
Nhap so luong sinh vien: ";
	cin >> n;

	sv = new Candidate[n];

	for (int i = 0; i < n; i++)
	{
		cout << "
Thong tin sinh vien thu " << i + 1 << " : 
";
		sv[i].nhap();
		sv[i].xuat();
	}

	delete sv;

	return 0;
}

```


<img src="https://daynhauhoc.com//daynhauhoc.s3-ap-southeast-1.amazonaws.com/original/2X/0/0465ef14aaaa7c70e687839f851cffa24453c109.png" width="690" height="387">
viết 22:06 ngày 30/09/2018

Bạn thay fflush(stdin) bằng cin.ignore(100,’\n’) xem. fflush chỉ dùng cho stdout và stderr. VS2015 hình như ko chạy được fflush(stdin), với lại code c++ thì dùng cin.ignore đi

Thiện Minh Trần viết 22:09 ngày 30/09/2018

Thanks bạn được rồi. Mà hai cái chức năng như nhau à :))

Ngô Doãn Tuấn viết 22:14 ngày 30/09/2018

Lỗi này là do bộ nhớ còn đọc lại ký tự enter của bạn nên dẫn tới hiện tượng như vậy
Việc bạn dùng fflush() trong visual 2015 là không được hỗ trợ.
Bạn nên chuyển quan
cin.clear();
cin.ignore();
để xóa bộ nhớ đệm.

viết 22:02 ngày 30/09/2018

cin.ignore và fflush khác nhau, fflush của C, cin.ignore của C++. fflush đẩy tất cả các kí tự còn trong bộ đệm ra ngoài(stdout,stderr), 1 số version trước của MSVC++ chạy được fflush(stdin) nhưng mang lên 1 vài compiler khác sẽ ko chạy. Còn cin.ignore thì bỏ qua 1 số kí tự nào đó cho tới khi bắt gặp 1 kí tự nào đó trong buffer, ví dụ cin.ignore(100,’\n’) sẽ bỏ qua 100 kí tự cho tới khi nó gặp kí tự ‘\n’. Bạn cũng có thể xóa buffer theo cách này:

int c;
while((c=getchar())!='\n'&&(c=getchar())!=EOF);
Bài liên quan
0