学生制作图书管理系统

为什么输入书本数目为3,只输入了 1本,这个程序就返回了

img


代码如下,恳请各位博主解答。

#include <stdio.h>
#include <stdlib.h>
#define maxsize 10000
/* run this program using the console pauser or add your own getch, system("pause") or input loop */
typedef struct booklist{
    char *name[50];
    char *writer[20];
    char *number[50];
}Book;

typedef struct listnode{
    Book *elem;
    int length;
}sqelist;

//初始化
sqelist L;
void Initlist(sqelist*L){
    L->elem=(Book *)malloc(maxsize*sizeof(Book));
    L->length=0;
}
//输入
void Inputelem(sqelist *L){
    int i;
    printf("请输入图书的数目:");
    scanf("%d",&L->length);
    for(i=0;i<L->length;i++);
        scanf("%s%s%d",L->elem[i].name,L->elem[i].writer,&L->elem[i].number);
}
//输出
void outputelem(sqelist *L){
    int i;
    printf("\t书名\t作者\t书号\n");
    for(i=0;i<L->length;i++)
        printf("\t%s\t%s\t%d\n",L->elem[i].name,L->elem[i].writer,L->elem[i].number);
}

//查找
void searchforname(sqelist *L,char *name){
    int i;
    for(i=0;i<L->length;i++){
        if(strcmp(L->elem[i].name,name)==0);
            break;
    }
    if(i<L->length)
        printf("你要查找的书名为%s的书号是: %d,作者是%s.\n",name,L->elem[i].number,L->elem[i].writer);
    else
        printf("查找不成功!");
}
void searchforloc(sqelist *L,int i){
    printf("第%d位置上的书是:%s,%s,%d\n",i,L->elem[i-1].name,L->elem[i-1].writer,L->elem[i-1].number);
}

void searchlist(sqelist *L){
    int choice;
    char name[20];
    while(1){
    
    printf("********现在开始查找*******");
    printf("        1.按书名查找.\n");
    printf("        2.按作者查找.\n");
    printf("        3.按书号查找.\n");
    printf("        4.按位置查找.\n");
    printf("        0.退出.\n");
    scanf("%d",&choice);
    if(choice==0)break;
    switch(choice){
        case 1:printf("请输入你要查找的书名:");scanf("%s",name);
                searchforname(L,name);break;
    //    case 2:printf("请输入你要查找的位置:");scanf("%d",int i); 
        //        searchforloc(L,int i);scanf("%s",int i);
    }
}
}
//插入
void listinsert(sqelist *L,int i,int j,Book e){
   if(i<1 || i>L->length+1) return 0;       
   if(L->length==maxsize) return 1;   
   for(j=L->length-1;j>=i-1;j--)
       L->elem[j+1]=L->elem[j];    
    L->elem[i-1]=e;                  
  ++L->length;                 
  return 0;
}

//删除 
void listDel(sqelist *L,int i,int j){
if((i<1)||(i>L->length)) return 0;     
   for (j=i;j<=L->length-1;j++)          
           L->elem[j-1]=L->elem[j];
       --L->length;
  return 0;
}


//菜单 
int main(int argc, char *argv[]) {
    int choice;
    while(1){

    printf("**********图书信息管理*******\n");
    printf("1.初始化\n           ");
    printf("2.图书信息输入\n     ");
    printf("          3.图书信息输出\n     ");
    printf("          4.查找\n             ");     
    printf("          5.插入\n             ");
    printf("          6.删除\n             ");
    printf("请输入你的选择:");
    scanf("%d",&choice);
    if(choice==0)break;
    else{
        switch(choice){
            case 1:Initlist(&L);break;
            case 2:Inputelem(&L);break;
            case 3:outputelem(&L);break;
            case 4:searchlist(&L);break;
        }
    }
    
    
    
    }
    return 0;
}

主要是 for() 后面多了; 分号。循环体是空的,scanf()在循环之外就只执行一次,

img


代码修改了一下:(如有帮助,望采纳!谢谢! 点击我这个回答右上方的【采纳】按钮)

#include <stdio.h>
#include <stdlib.h>
#define maxsize 10000
/* run this program using the console pauser or add your own getch, system("pause") or input loop */
typedef struct booklist{
    char name[50];
    char writer[20];
    int number;
}Book;
typedef struct listnode{
    Book *elem;
    int length;
}sqelist;
//初始化
sqelist L;
void Initlist(sqelist*L){
    L->elem=(Book *)malloc(maxsize*sizeof(Book));
    L->length=0;
}
//输入
void Inputelem(sqelist *L){
    int i,s,n;
    printf("请输入图书的数目:");
    scanf("%d",&n);
    s = L->length;
    for(i=0;i<n;i++)  //你多了;
        scanf("%s%s%d",L->elem[s+i].name,L->elem[s+i].writer,&L->elem[s+i].number);
    L->length += n;
}
//输出
void outputelem(sqelist *L){
    int i;
    printf("\t书名\t作者\t书号\n");
    for(i=0;i<L->length;i++)
        printf("\t%s\t%s\t%d\n",L->elem[i].name,L->elem[i].writer,L->elem[i].number);
}
//查找
void searchforname(sqelist *L,char *name){
    int i;
    for(i=0;i<L->length;i++){
        if(strcmp(L->elem[i].name,name)==0);
            break;
    }
    if(i<L->length)
        printf("你要查找的书名为%s的书号是: %d,作者是%s.\n",name,L->elem[i].number,L->elem[i].writer);
    else
        printf("查找不成功!");
}
void searchforloc(sqelist *L,int i){
    printf("第%d位置上的书是:%s,%s,%d\n",i,L->elem[i-1].name,L->elem[i-1].writer,L->elem[i-1].number);
}
void searchlist(sqelist *L){
    int choice;
    char name[20];
    while(1){
    printf("********现在开始查找*******");
    printf("        1.按书名查找.\n");
    printf("        2.按作者查找.\n");
    printf("        3.按书号查找.\n");
    printf("        4.按位置查找.\n");
    printf("        0.退出.\n");
    scanf("%d",&choice);
    if(choice==0)break;
    switch(choice){
        case 1:printf("请输入你要查找的书名:");scanf("%s",name);
                searchforname(L,name);break;
    //    case 2:printf("请输入你要查找的位置:");scanf("%d",int i);
        //        searchforloc(L,int i);scanf("%s",int i);
    }
}
}
//插入
void listinsert(sqelist *L,int i,int j,Book e){
   if(i<1 || i>L->length+1) return 0;
   if(L->length==maxsize) return 1;
   for(j=L->length-1;j>=i-1;j--)
       L->elem[j+1]=L->elem[j];
    L->elem[i-1]=e;
  ++L->length;
  return 0;
}
//删除
void listDel(sqelist *L,int i,int j){
if((i<1)||(i>L->length)) return 0;
   for (j=i;j<=L->length-1;j++)
           L->elem[j-1]=L->elem[j];
       --L->length;
  return 0;
}

//菜单
int main(int argc, char *argv[]) {
    int choice;
    while(1){
    printf("**********图书信息管理*******\n");
    printf("   1.初始化\n");
    printf("   2.图书信息输入\n");
    printf("   3.图书信息输出\n");
    printf("   4.查找\n");
    printf("   5.插入\n");
    printf("   6.删除\n");
    printf("请输入你的选择:");
    scanf("%d",&choice);
    if(choice==0)break;
    else{
        switch(choice){
            case 1:Initlist(&L);break;
            case 2:Inputelem(&L);break;
            case 3:outputelem(&L);break;
            case 4:searchlist(&L);break;
        }
    }

    }
    return 0;
}

img

因为你跳转输入数据的函数只执行了一次,应该循环x次才行

img