Vì sao code không nhập được chuỗi?

em xin hỏi các anh vì sao em không nhập được mã mặt hàng
code

#include <iostream>
#include <conio.h>

using namespace std;

struct HangHoa
{
	char mamh[10], tenmh[50];
	float dongia;
	int soluong;
};
void nhap(HangHoa a[],int &n)
{
	do
	{
		cout << "NHAP SO LUONG MAT HANG : ";
		cin >> n;
	} while (n <= 0);
	for (int i = 0; i < n; i++)
	{
		cout << "NHAP MAT HANG THU " << i + 1 << "\n";
		cout << "NHAP MA MAT HANG : ";
		fflush(stdin);
		cin.getline(a[i].mamh, 10);
		cout << "NHAP TEN MAT HANG : ";
		cin.getline(a[i].tenmh, 50);
		cout << "NHAP SO LUONG : ";
		cin >> a[i].soluong;
		cout << "NHAP DON GIA : ";
		cin >> a[i].dongia;
	}
}
void xuat(HangHoa a[], int n)
{
	cout << "DANH SACH MAT HANG VUA NHAP \n";
	for (int i = 0; i < n; i++)
		cout << i + 1 << "\t" << a[i].mamh << "\t" << a[i].tenmh << "\t" << a[i].soluong << "\t" << a[i].dongia;
}
int kiemTraChuoi(char d[], char s[])
{
	int n = 0;
	n = strlen(s);
	for (int i = 0; i < n; i++)
		if (d[i] != s[i])
			return 0;
	return 1;
}
void kiemTraMaHang(HangHoa a[], char s[])
{
	for (int i = 0; i <= 1; i++)
		if ((kiemTraChuoi(a[i].mamh, s) == 1))
		{
			cout << "\n" << a[i].mamh << "\t" << a[i].tenmh << "\t" << a[i].soluong << "\t" << a[i].dongia;
			break;
		}
	
}

void main()
{	
	HangHoa a[100];
	int n;
	char s[10];
	nhap(a, n);
	xuat(a, n);
	cout << "\nNHAP MA MH CAN TIM : ";
	fflush(stdin);
	cin.getline(s, 10);
	cout << "MAT HANG CAN TIM LA \n";
	kiemTraMaHang(a, s);

	_getch();
}

kết quả khi chạy

Vì dòng fflush(stdin) đấy, đừng dùng nó.
Nó không phải là nguyên nhân trực tiếp gây ra vấn đề này (đây không phải là lỗi).
Nguyên nhân trực tiếp là nhập sốkí tự xuống dòng. Và một phần do thói quen dùng phím Enter.
Nếu nhập số trước khi nhập chuỗi mà dùng phím Enter sau số thì sẽ gặp vấn đề này.
Trong đoạn mã của bạn, có 2 chỗ số trước chuỗi:

  1. Nhập số lượng mặt hàng, sau đó vào vòng lặp nhập chuỗi.
  2. Dòng nhập số cuối trong vòng lặp, sau đó lặp trở lại dòng nhập chuỗi đầu vòng lặp.

Hàm getline() đầu tiên đã nhận 1 chuỗi rỗng khi gặp kí tự xuống dòng (\n) sau khi bạn nhập số.
Đối với đoạn mã của bạn, nhập thế này sẽ chạy tốt:

2MAHANG001
Tivi
100
1000MAHANG002
Tu lanh
100
1000

Nếu muốn khắc phục khi nhập và nhấn Enter cho mỗi giá trị trên 1 dòng thì thay fflush(stdin); bằng cin.getline(dummy, 100);. dummy là biến kiểu char[] (giống với mamhtenmh) mục đích chủ yếu là có biến để truyền vào hàm thôi. Lúc này chuỗi rỗng và kí tự xuống dòng đã bị loại bỏ. Có thể nhập theo ý bạn.
Bỏ và đừng dùng fflush(stdin) nữa.

2 Likes

Kì thị fflush(stdin) đi bn :v:

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