Bị lỗi hàm cin.getline C++

Chào mn, cho mình hỏi lỗi này là lỗi gì ạ, mình nhập vào số 4 đề tìm , tiếp theo mình nhập 1 đề tim theo mã, mình nhập chuỗi vào thì bị lỗi ạ.

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

struct ThoiGian
{
	int ngay, thang;
	long nam;
};
struct Sach
{
	char masach[20];
	char tensach[30];
	ThoiGian ngayxuatban;
	int soluong;
};
struct DSSach
{
	Sach ds[100];
	int n;
};
typedef struct NODE*NODEPTR;
struct NODE
{
	Sach info;
	NODEPTR next;
};

void Khoi_Tao(NODEPTR &L);
bool KT_Rong(NODEPTR L);
NODEPTR Tao_Node(Sach s);
void Nhap_1_Quyen_Sach(Sach &s);
void Xuat_1_Quyen_Sach(Sach s);
bool Kiem_Tra1(string s);
bool KT_NgayThangMam(ThoiGian t);
void Chon_Chuong_Trinh(NODEPTR &L);
void Them_Dau(NODEPTR &L, Sach s);
void Them_Cuoi(NODEPTR &L, Sach s);
void Xuat_DS_Sach(NODEPTR L);
void Them_Sach_Vi_Tri_Bat_Ky(NODEPTR &L, int vitri, Sach s);
int Do_Dai_DS(NODEPTR L);
void Tim_Kiem_Ma(NODEPTR L, char ma[20]);

void Khoi_Tao(NODEPTR &L)
{
	L = NULL;
}

bool KT_Rong(NODEPTR L)
{
	return L == NULL ? true : false;
}

NODEPTR Tao_Node(Sach s)
{
	NODEPTR p = new NODE();
	p->info = s;
	p->next = NULL;
	return p;
}

void Nhap_1_Quyen_Sach(Sach &s)
{
	string x;
	cout << "\nMa sach: ";
	fflush(stdin);
	cin.getline(s.masach, 20);
	cout << "\nTen sach: ";
	fflush(stdin);
	cin.getline(s.tensach, 20);
tt:
	cout << "\nNgay, thang, nam xuat ban: ";
	fflush(stdin);
	getline(cin, x);
	if (!Kiem_Tra1(x))
		goto tt;
	s.ngayxuatban.ngay = atoi(x.c_str());
	fflush(stdin);
	getline(cin, x);
	if (!Kiem_Tra1(x))
		goto tt;
	s.ngayxuatban.thang = atoi(x.c_str());
	fflush(stdin);
	getline(cin, x);
	if (!Kiem_Tra1(x))
		goto tt;
	s.ngayxuatban.nam = atoi(x.c_str());
	if (!KT_NgayThangMam(s.ngayxuatban))
		goto tt;
tt1:
	cout << "\nSo luong: ";
	fflush(stdin);
	getline(cin, x);
	if (!Kiem_Tra1(x))
		goto tt1;
	s.soluong = atoi(x.c_str());
}

void Xuat_1_Quyen_Sach(Sach s)
{
	cout << setw(20) << left << s.masach << "\t" << setw(20) << left << s.tensach << "\t" << setw(8) << left << s.soluong << "\t" << s.ngayxuatban.ngay << "/" << s.ngayxuatban.thang << "/" << s.ngayxuatban.nam << endl;
	cout << endl;
}

bool Kiem_Tra1(string s)
{
	if (s[0] < 47 || s[0]>57)
		return false;
	return true;
}

bool KT_NgayThangMam(ThoiGian t)
{
	if (t.ngay <= 0 || t.thang <= 0 || t.nam <= 0)
		return false;
	else
	{
		if ((t.thang == 1 || t.thang == 3 || t.thang == 5 || t.thang == 7 || t.thang == 8 || t.thang == 10 || t.thang == 12) && (t.ngay >= 1 && t.ngay <= 31))
			return true;
		else if (t.thang == 2)
		{
			if (t.nam % 4 == 0 && t.ngay >= 1 && t.ngay <= 29)
				return true;
			else if (t.nam % 4 != 0 && t.ngay >= 1 && t.ngay <= 28)
				return true;
			else return false;
		}
		else if ((t.thang == 2 || t.thang == 4 || t.thang == 6 || t.thang == 9 || t.thang == 11) && (t.ngay >= 1 && t.ngay <= 30))
			return true;
		else return false;
	}
}

void Them_Dau(NODEPTR &L, Sach s)
{
	NODEPTR  p = Tao_Node(s);
	NODEPTR q = L;
	if (L == NULL)
		L = p;
	else
	{
		p->next = q;
		L = p;
	}
}

void Them_Cuoi(NODEPTR &L, Sach s)
{
	NODEPTR q, p = Tao_Node(s);
	if (L == NULL)
	{
		Them_Dau(L, s);
	}
	else
	{
		q = L;
		while (q->next != NULL)
		{
			q = q->next;
		}
		q->next = p;
	}
}

void Xuat_DS_Sach(NODEPTR L)
{
	NODEPTR q = L;
	while (q != NULL)
	{
		Xuat_1_Quyen_Sach(q->info);
		q = q->next;
	}
}

void Tim_Kiem_Ma(NODEPTR L, char ma[20])
{
	DSSach ds;
	ds.n = 0;
	NODEPTR q = L;
	while (q != NULL)
	{
		if (strcmp(q->info.masach, ma) == 0)
		{
			ds.ds[ds.n++] = q->info;
			break;
		}
		q = q->next;
	}
	for each (Sach s in ds.ds)
	{
		Xuat_1_Quyen_Sach(s);
	}
}

int Do_Dai_DS(NODEPTR L)
{
	int dodai = 0;
	NODEPTR q = L;
	while (q != NULL)
	{
		dodai++;
		q = q->next;
	}
	return dodai;
}

void Them_Sach_Vi_Tri_Bat_Ky(NODEPTR &L, int vitri, Sach s)
{
	NODEPTR r, q, p = Tao_Node(s);
	q = L->next;
	r = L;
	int dem = 0;
	if (vitri == 0)
	{
		Them_Dau(L, s);
	}
	else if (vitri == Do_Dai_DS(L) + 1)
	{
		Them_Cuoi(L, s);
	}
	else
	{
		while (dem != vitri)
		{
			dem++;
			q = q->next;
			r = r->next;
		}
		p->next = q;
		r->next = p;
	}
}

void Chon_Chuong_Trinh(NODEPTR &L)
{
	Sach s;
	int chon, chon1,chon2,vitri;
	char x[20];
tt:
	cout << "\n\t\t\tCHUONG TRINH QUAN LY SACH\n";
	cout << "\n1/Nhap danh sach sach";
	cout << "\n2/Xuat danh sach sach";
	cout << "\n3/Them 1 sach vao vi tri bat ky";
	cout << "\n4/Tim kiem sach";
	cout << "\nChon chuong trinh hoac nhap 0 de thoat: ";
	
	cin >> chon;
	switch (chon)
	{
	case 1:
	{
		tt1:
		cout<<"\nNhap thong tin hoac thoat 1/0";
		cin >> chon1;
		if (chon1 == 1)
		{
			Nhap_1_Quyen_Sach(s);
			Them_Cuoi(L, s);
			goto tt1;
		}
		break;
	}
	case 2:
	{
		Xuat_DS_Sach(L);
		break;
	}
	case 3:
	{
		cout << "\nNhap thong tin sach muon them: ";
		Nhap_1_Quyen_Sach(s);
		cout << "\nNhap vi tri muon them: ";
		cin >> vitri;
		Them_Sach_Vi_Tri_Bat_Ky(L, vitri-1, s);
		break;
	}
	case 4:
	{
		cout << "\n1/Tim kiem theo ma";
		cout << "\n1/Tim kiem theo ten";
		cout << "\n1/Tim kiem theo ngay xuat ban";
		cin >> chon2;
		switch (chon2)
		{
		case 1:
		{
			cout << "\nNhap ma tim kiem";
			fflush(stdin);
			cin.getline(x, 20);



			Tim_Kiem_Ma(L, x);
			break;
		}
		default:
			break;
		}
		break;
	}
	default:
		break;
	}
	if (chon != 0)
		goto tt;
}


void main()
{
	NODEPTR L;
	Khoi_Tao(L);
	Chon_Chuong_Trinh(L);
	system("Pause");
}


trước mấy chỗ std::getline HOẶC sau máy chỗ std::cin (ưu tiên sau std::cin), bạn nên thêm 2 dòng lệnh

std::cin.clear(); //Xóa những thứ còn lại trong stream
std::cin.ignore(32767,'\n') //bỏ qua các phần từ cho đến phần tử '\n' (newline), 32767 bạn thay bằng số mấy cũng được.
1 Like
83% thành viên diễn đàn không hỏi bài tập, còn bạn thì sao?