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

c++

(Le Quang Cuong) #1

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 ạ.


(Le Quang Cuong) #2

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


(rogp10) #3

Đơ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.


(Le Quang Cuong) #4

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


(Le Quang Cuong) #5

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ì đó.


(Le Quang Cuong) #6

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 ạ.


(HK boy) #7

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


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