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 << "\nNhap ma so sinh vien : ";
	getline(cin, mssv);

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

	cout << "\nNgay sinh : ";
	cin >> ngay;
	cout << "\nThang : ";
	cin >> thang;
	cout << "\nNhap nam: ";
	cin >> nam;

	cout << "\nToan : ";
	cin >> toan;
	cout << "\nAnh : ";
	cin >> anh;
	cout << "\nVan : ";
	cin >> van;
}
 
void Candidate::xuat()

{
	cout << "\nMa so : " << mssv;
	cout << "\nHo ten : " << hoten;
	cout << "\nNgay sinh : ngay " << ngay << " thang " << thang << " nam " << nam;
	cout << "\nToan : " << toan << " diem";
	cout << "\nAnh : " << anh << " diem";
	cout << "\nVan : " << van << " diem";
}

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

	sv = new Candidate[n];

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

	delete sv;

	return 0;
}

```


<img src="//daynhauhoc.s3-ap-southeast-1.amazonaws.com/original/2X/0/0465ef14aaaa7c70e687839f851cffa24453c109.png" width="690" height="387">

1 Like

Lỗi không thể nhập biến char trong class

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

3 Likes

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

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 :smiley:
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.

3 Likes

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);

1 Like