Bị mất chữ cái đầu khi dùng cin.ignore()

Em có đoạn code sau:

#include<iostream>
#include<string>
struct SV {
	std::string Ten, ID;
	int ngay, thang, nam;
};
void main() {
	SV sv[2];
	int n = 2;
	for (int i = 0; i < n; i++) {
		std::cout << "SV[" << i + 1 << "]:";
		
		std::cout << " Nhap ho ten: ";
		std::cin.ignore();
		std::getline(std::cin, sv[i].Ten);
		std::cout << " Nhap ID: "; std::cin >> sv[i].ID;
		std::cout << " Nhap ngay sinh(): "; std::cin >> sv[i].ngay >> sv[i].thang >> sv[i].nam;

	}
	for (int i = 0; i < n; i++)
		std::cout << sv[i].Ten<<" ";
	system("pause");
}

Anh chị cho em hỏi là tại sao khi in ra cái Ten nó lại bị mất chữ đầu, có phải là do std::cin.ignore()?
Nhưng mà nếu không dùng std::cin.ignore() thì tới vòng lặp i=1 nó sẽ bỏ qua bước nhập tên, qua bước nhập ID luôn. Anh chị nào giải thích giúp em với ạ.

Em có thử xài lệnh fflush(stdin) thì không được, nó vẫn bỏ qua bước nhập Ten của lần nhập thứ 2

Đơn giản là bạn đặt nó sai chỗ.

VS 2015 là bỏ rồi :smiley: vì flush một luồng ghi mới có nghĩa.

3 Likes

Vậy nên đặt chổ nào anh? Bí nãy giờ mà mò riết không ra. :frowning:

Em có đặt lên trên nhưng mỗi lần nhập nó bắt phải nhập 1 cái gì đó.

Với nếu đặt lên trên dòng

std::cout << " Nhap ho ten: ";

thì khi in ra nó sẽ như này:

SV[1]:
   Nhap ho ten: ................
   ........
SV[2]:Nhap ho ten: ..........

Nó xấu anh ạ.

Bỏ qua mấy cái dòng mời mọc như Nhap ho ten đi.

cin.ignore() sẽ hiệu quả nếu như trong stdin vẫn còn kí tự. Trong trường hợp này, thay vì dùng cin.ignore() thì dùng fflush(stdout).

1 Like

bạn nên đặt cin.ignore(); dưới câu lệnh cin gần nhất bên trên

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