Bị mất kí tự đầu khi dùng cin.ignore()

Chào các anh chị và các bạn. Cho em hỏi là tại sao khi em dùng cin.ignore(); lúc nhập msv thì khi xuất bị mất kí tự đầu, còn dùng fflush(stdin) thì lại được ạ. Em xin cảm ơn ạ.

#include <stdio.h>
#include <iostream>
#include <string>
using namespace std;
class Sinhvien{
private:
	char msv[30];
	string hoten;
	int tuoi;
	double diem;
public:
	void Nhap();
	void Xuat();
};

void Sinhvien::Nhap() {
	cout << "Nhap ma so sinh vien: ";
	//cin.ignore();
	fflush(stdin);
	//getline(cin, msv);
	gets(msv);
	cout << "Nhap ho ten sinh vien: ";
	///cin.ignore();
	fflush(stdin);
	getline(cin, hoten);
	cout << "Nhap tuoi sinh vien: ";
	cin >> tuoi;
	cout << "Nhap diem sinh vien: ";
	cin >> diem;
}
void Sinhvien::Xuat() {
	cout << "\n____________________________\n";
	cout << "Ma so sinh vien: " << msv;
	cout << "\nHo ten sinh vien: " << hoten;
	cout << "\nTuoi sinh vien: " << tuoi;
	cout << "\nDiem sinh vien: " << diem;
}

int main(){
	Sinhvien a;
	Sinhvien b;
	a.Nhap();
	b.Nhap();
	a.Xuat();
	b.Xuat();
	return 0;
}

cin.ignore() là bỏ qua 1 kí tự (hoặc nhiều nếu có thêm tham số).
Phương thức này thường được dùng để loại bỏ kí tự xuống dòng ('\n') sau khi nhập SỐ.

3 Likes

ý em là chỗ này nếu em thay fflush bằng cin.ignore thì biến msv khi xuất bị mất kí tự đầu ạ

cout << "Nhap ma so sinh vien: ";
//cin.ignore();
fflush(stdin);
gets(msv);

Bạn thấy từ SỐ được viết HOA không nhỉ?
Nhặc lại: SAU KHI NHẬP SỐ.
Có nghĩa là các kiểu số: int, long, floatdouble.
msv của bạn là kiểu gì???

3 Likes

Ok, cảm ơn anh :smile:.
Em đã tìm được hướng giải quyết rồi. Về lệnh xóa kí tự xuống dòng trước getline(cin, hoten) thì không cần đến, còn lệnh xóa kí tự xuống dòng trước gets(msv) thì chuyển về cuối hàm Nhap() sau lệnh cin>> diem.

1 Like
83% thành viên diễn đàn không hỏi bài tập, còn bạn thì sao?