Code chạy không tiếp tục nhập được dữ liệu

Mọi người ơi sao mình chạy code mà nó bị lỗi này là sao vậy ạ

#include<stdio.h>
#include<string.h>
#include <conio.h>
struct book
	{
	char TenSach[70];
	char TacGia[50];
	char Ma[50] ;
};

void Nhap(struct book &a)
	{
	printf("Nhap ten sach: ");
	fflush(stdin);
	scanf("%d",&a.TenSach);
	printf("Nhap ten tac gia: ");
    scanf("%d",a.TacGia);
	printf("Nhap ma cua sach: ");
   scanf("%d",&a.Ma );
}
void NhapDanhSach(struct book DS[],int n){
	for(int i=0;i<n;i++){
		printf("Nhap cuon sach thu %d: \n",i+1);
		Nhap(DS[i]);
	}
}
void Xuat(struct book a){
	printf("\tten sach: %s\n",a.TenSach);
	printf("\tten tac gia cua cuon cach: %s\n",a.TacGia);
	printf("\tma cua sach: %s\n",a.Ma);
}
void XuatDanhSach(struct book DS[], int n){
	printf("\n**************************\n");
	for(int i=0;i<n;i++){
		printf("thong tin cuon sach thu %d: \n",i+1);
		Xuat(DS[i]);
	}
}
 //tim kiem ma theo danh sach
void search(struct book a[], int n){
    char id[100];
    printf("\n nhap ma cua cuon sach ban muon tim kiem: ");
    fflush(stdin);
    gets(id);
    for (int i = 0; i < n; i++)
    {
        if (strcmp(a[i].Ma, id) ==0)
        {
            printf("\n cuon sach can tim la: ");
            Xuat(a[i]);
        }
        
    }
}
// tim kiem theo ten tac gia
void search1(struct book a[], int n){
    char name[100];
    printf("\n nhap ten tac gia ban muon tim kiem: ");
    fflush(stdin);
    gets(name);
    for (int i = 0; i < n; i++)
    {
        if (strcmp(a[i].TacGia,name) ==0)
        {
            printf("\n cuon sach can tim la: ");
            Xuat(a[i]);
        }
        
    }
}
//Viet ham sap xep theo ma sach
void SapXepthutuMa(struct book a[], int n)
	{
	for(int i=0;i<n-1;i++)
		{
		for(int j=i+1;j<n;j++)
			{
			if(a[i].Ma>a[j].Ma)
				{
				struct book temp=a[i];
				a[i]=a[j];
				a[j]=temp;
			}
		}
	}
	printf("\nDanh sach ma sach duoc sap theo thu tu: ");
	XuatDanhSach(a,n);
}
//Viet ham sap xep theo ten sach.
void SapXepthututen(struct book a[], int n){
	for(int i=0;i<n-1;i++){
		for(int j=i+1;j<n;j++){
			if(strcmp(a[i].TenSach,a[j].TenSach)>0){
				struct book t=a[i];
				a[i]=a[j];
				a[j]=t;
			}
		}
	}
	printf("\nDanh sach ten sach duoc sap theo thu tu abc: ");
	XuatDanhSach(a,n);
}
//viêt ham sap xêp theo tac gia trung tac gia thi sap sep theo ma sach
void SapXepthututacgia(struct book a[], int n)
	{
	for(int i=0;i<n-1;i++)
	{
		for(int j=i+1;j<n;j++)
		{
			if(strcmp(a[i].TacGia,a[j].TacGia)>0)
				{
				struct book t=a[i];
				a[i]=a[j];
				a[j]=t;
				}
				else if (strcmp(a[i].TacGia, a[j].TacGia) == 0)
			    {
				   if  (strcmp(a[i].Ma, a[j].Ma) > 0)
				     {
					struct book t=a[i];
				a[i]=a[j];
				a[j]=t;
                     }
                }
        }
    }
}	


int main ()
	{
	struct book a[100];
	int SoCuonSach;
	printf("Nhap vao so sach (!=0): ");
	scanf("%d", &SoCuonSach);
	NhapDanhSach(a,SoCuonSach);
	search(a,SoCuonSach);
	search1(a,SoCuonSach);
	XuatDanhSach(a,SoCuonSach);
	SapXepthutuMa(a,SoCuonSach);
	SapXepthututen(a,SoCuonSach);
	SapXepthututacgia(a,SoCuonSach);
	
 }

Vậy mình nên làm sao hả bạn

1 là bạn có thể thử dùng thêm fflush trước mỗi lần nhập như lần đầu tiên, 2 là b thử dùng gets xem có được ko.

1 Like

gets để làm gì bạn :worried: :worried: :worried:

Bạn biết %d khác với %s ở chỗ nào không?

Bạn đang khai báo cấu trúc với 3 thành viên đều kiểu chuỗi char TenSach[70], vậy mà khi nhập lại dùng %d.
Theo gợi ý của @Vu_Nguyen5 thì bạn nên dùng gets. Nó để làm gì hả?
https://www.cplusplus.com/reference/cstdio/gets/

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