做了个简单c语言通讯录出现了问题

就是选择分类的时候本来0是返回上一项菜单的,结果变成新的一类
#include /*标准输入输出函数库*/
#include /*标准函数库*/
#include
#include
FILE *fp;
struct Data
{
int fenlei;
char name[10]; //姓名
char tel[15]; //电话
char age[8]; //年龄
char qq[10]; //QQ号

} ren[1000];
struct Data1
{
struct Data data;
struct Data1 *next;
} *p,*p1,*p2;
struct zhanghao
{
char username[20];
char password[10];
} zh,*zh1,*zh2;
struct LNode
{
char clas[20];
int length;
struct Data1 *next;
} a[6];

int menu() //主菜单选择函数
{
int c; //定义一个整型变量
do
{
system("cls"); //清屏
printf("\t*******通讯录*******\n");
printf("\t--------------------\n");
printf("\t 1、通讯信息显示 \n");
printf("\t 2、通讯信息保存 \n");
printf("\t 3、通讯信息删除 \n");
printf("\t 4、通讯信息修改 \n");
printf("\t 5、通讯信息增加 \n");
printf("\t 6、通讯信息查询 \n");
printf("\t 0. 退出 \n");
printf("\t--------------------\n");
printf("\t请您选择(0-6):");
scanf("%d",&c);
}
while(c>7&&c<0);
return(c);
}
void openclass()
{
FILE *fp1;
int i;
if ((fp1=fopen("contact.dat","r"))==NULL)
{
printf("\n不存在分类类别");

    if ((fp1=fopen("contact.dat","w"))==NULL) //不存在则进行创建
    {
        printf("\n建立失败");
        exit(0);
    }
    strcpy(a[1].clas,"1.家人亲戚");            //依次将下一条信息复制到上一条的位置
    strcpy(a[2].clas,"2.朋友");
    strcpy(a[3].clas,"3.同学");
    strcpy(a[4].clas,"4.同事");
    strcpy(a[5].clas,"5.陌生人");
    strcpy(a[6].clas,"6.其他");
    for (i=1; i<=6; i++)
    {

        if (fprintf(fp1,"%s\n",a[i].clas)==0)
        {
            printf("\n文件保存错误!\n");
        }
        a[i].length=0;
        a[i].next=NULL;

    }
}
else
{

    rewind(fp1);
    for (i=1; !feof(fp1) && fscanf(fp1,"%s\n",a[i].clas); i++)a[i].next=NULL;
    printf("\n类别文件导入成功\n");
}
fclose(fp1);
//printf("\n按任意键返回主菜单:");
// getch();//按任意键退出
return;

}
int select()
{
int c,i=1;
do
{
printf("\n1.家人亲戚\n");
printf("2.朋友\n");
printf("3.同学\n");
printf("4.同事\n");
printf("5.陌生人\n");
printf("6.其他\n");
printf("0.返回主菜单\n");
printf("请您选择(0-6):");
scanf("%d",&c);
if(c6)
printf("输入错误!请重新输入:\n");

}
while(c<0||c>6);
if (c==0)return;
else  return (c);

}
int checkUerValid(struct zhanghao zh1)/校验用户合法性*/
{
FILE*fp;
struct zhanghao zh[1],*zh2=zh;
char *usr,*pwd;
int check=0;
usr=zh1->username;
pwd=zh1->password;

if((fp=fopen("user.dat","rb"))==NULL)
{
    printf("File open error!\n");
    exit(0);
}
rewind(fp);
fread(zh2,sizeof(struct zhanghao),1,fp);
if((strcmp(usr,zh2->username)==0)&&(strcmp(pwd,zh2->password)==0))
{
    check=1;
}
if(fclose(fp))

{
    printf("不能关闭文件!\n");
    exit(0);
}
return check;

}
void Readfile()
{
int n,i;
openclass();
if((fp=fopen("user.dat","rb"))!=NULL)
{

    printf("通讯录文件已存在。\n");
    rewind(fp);
    fread(&p2,sizeof(struct zhanghao),1,fp);

    printf("请输入用户名:");
    scanf("%s",zh.username);
    printf("请输入密码:");
    scanf("%s",zh.password);

    while(checkUerValid(&zh)!=1)
    {
        printf("密码错误,请重新输入:\n");
        printf("请输入用户名:");
        scanf("%s",zh.username);
        printf("请输入密码:");
        scanf("%s",zh.password);

    }
    fclose(fp);
}
if((fp=fopen("catalog.dat","rb"))==NULL)
{
    printf("\n通讯录文件不存在!");
    if ((fp=fopen("catalog.dat","wb"))==NULL) //不存在则进行创建
    {
        printf("\n建立失败");
        exit(0);
    }
    else
    {
        if ((fp=fopen("user.dat","wb"))==NULL) //不存在则进行创建
        {
            printf("\n建立失败");
            exit(0);
        }
        else
        {
            printf("\n输入注册号(不大于8位数):");
            struct zhanghao zh[1],*zh1=zh;
            scanf("%s",zh1->username);
            while(strlen(zh1->username)>=8)
            {
                printf("\n注册号输入错误!请重新输入:");
                scanf("%s",zh1->username);
            }
            printf("\n输入注册号密码(不大于8位数):");
            scanf("%s",zh1->password);
            while(strlen(zh1->password)>=8)
            {
                printf("\n注册号输入错误!请重新输入:");
                scanf("%s",zh1->password);
            }

            fwrite(zh1,sizeof(struct zhanghao),1,fp);
        }
        fclose(fp);
        printf("\n通讯录文件已建立\n");
        printf("\n按任意键进入主菜单");
        getch();
        return;
    }
    exit(0); //退出
}
fseek(fp,0,2); //文件位置指针移动到文件末尾
if (ftell(fp)>0) //文件不为空,获取的是文件长度
{
    //rewind(fp); //文件位置指针移动到文件开始位置
    fseek(fp,0,0); //文件位置指针移动到文件开始位置
    for ( n=0; !feof(fp) && fread(&ren[n],sizeof(struct Data),1,fp); n++);
    //for(i=0;i<=n;i++)printf("%s",dat[i].name);
    for(i=0; i<=n; i++)
    {
        p1=a[ren[i].fenlei].next;
        p=(struct Data1*)malloc(sizeof(struct Data1));
        p->data=ren[i];
        p->next=NULL;
        if(a[ren[i].fenlei].next==NULL)
        {
            a[ren[i].fenlei].next=p;
            a[ren[i].fenlei].length++;
        }
        else
        {
            while(p1->next!=NULL)p1=p1->next;
            p1->next=p;
            a[ren[i].fenlei].length++;
        }
    }
    //从文件流中读取数据,以Data结构体接收读取的数据,并由n记录下文件中联系人个数
    printf("\n文件导入成功\n");
    printf("\n按任意键进入主菜单:");

    getch();
    return;
}
fclose(fp);
printf("\n文件导入成功\n");
printf("\n文件中没有数据\n");
printf("\n按任意键进入主菜单:");
getch();//按任意键退出
return;

}
int input1(struct LNode a[],int n)
{
char s[10];
char ch,m;
while(ch!='n'&&ch!='N')
{
p1=a[n].next;
printf("添加新联系人\n");
printf("姓名:");
p=(struct Data1*)malloc(sizeof(struct Data1));
p->next=NULL;
scanf("%s",s);
if(p1!=NULL)
{
while((strcmp(p1->data.name,s)!=0)&&p1->next!=NULL)
p1=p1->next;
if(strcmp(p1->data.name,s) == 0)
{
printf("通讯录中已有此人!\n");
printf("是否继续添加?(Y/N)");
scanf("%s",&m);
while(m!='n'&&m!='N'&&m!='y'&&m!='Y')
{
printf("\n输入错误!请重新输入:");
scanf("%s",&m);
}
if(m!='n'&&m!='N')
{
input1(a,n);
}
return 0;
}
if(p1->next==NULL)
{

            printf("电话:");
            scanf("%s",p->data.tel);
            printf("电子邮件:");
            scanf("%s",p->data.age);

            printf("QQ号:");
            scanf("%s",p->data.qq);
            strcpy(p->data.name,s);
            printf("类别:%d",n);
            p->data.fenlei=n;
            p1->next=p;
            a[n].length++;
        }
    }
    else
    {
        printf("电话:");
        scanf("%s",p->data.tel);
        printf("电子邮件:");
        scanf("%s",p->data.age);

        printf("QQ号:");
        scanf("%s",p->data.qq);
        strcpy(p->data.name,s);
        printf("类别:%d",n);
        p->data.fenlei=n;
        a[n].next=p;
        a[n].length++;
    }
    printf("\n是否继续添加?(Y/N)");
    scanf("%s",&ch);
    while(ch!='n'&&ch!='N'&&ch!='y'&&ch!='Y')
    {
        printf("\n输入错误!请重新输入:");
        scanf("%s",&ch);
    }
}
printf("\n添加成功!\n");
printf("\n按任意键返回主菜单:");
getch();
return 0;

}
void print11(struct LNode a[],int n)
{
int l=1;
if(a[n].length>0)
{
printf("共%d条记录\n",a[n].length);
p1=p=a[n].next;
while(p!=NULL)
{

        printf("\n%d\n类别:",l++);
        printf("%d\n",p->data.fenlei);
        printf("姓名:");
        printf("%s\n",p->data.name);
        printf("电话:");
        printf("%s\n",p->data.tel);
        printf("电子邮件:");
        printf("%s\n",p->data.age);

        printf("QQ:");
        printf("%s\n",p->data.qq);
        p=p->next;
    }
}
else printf("\n名片数为0!\n");
printf("\n按任意键返回主菜单:");
getch();
return;

}
void allprint(struct LNode a[])
{
int n,sum=0,l=0;
for(n=1; n {
sum=sum+a[n].length;
}
printf("\n一共%d记录",sum);
for(n=1; n {
if(a[n].length>0)
{
printf("\n类别%d共%d条记录\n",n,a[n].length);
p1=p=a[n].next;
while(p!=NULL)
{

            printf("%d\n",p->data.fenlei);
            printf("姓名:");
            printf("%s\n",p->data.name);
            printf("电话:");
            printf("%s\n",p->data.tel);
            printf("电子邮件:");
            printf("%s\n",p->data.age);

            printf("QQ:");
            printf("%s\n",p->data.qq);
            p=p->next;
        }
    }
    else printf("\n名片数为0!\n");
    printf("\n按任意键返回主菜单:");
    getch();
    return;
}

}
void print111(struct LNode a[])
{
int m,n;
printf("\n请选择显示方式:\n");
printf("1--分类显示 \n");
printf("2--全部显示\n");
printf("0--返回菜单\n");
printf("请选择(0-2):");
scanf("%d",&m);
while(m!=1&&m!=2&&m!=0)
{
printf("\n输入错误,请重新选择:");
scanf("%d",&m);
}
if(m==1)
{
printf("\n请输入要查询的分类");
n=select();
print11(a,n);
}
if(m==2)
{
allprint(a);
}
if(m==0)
{
return;
}
}
void namefind(struct LNode a[],int n)
{
char s[20];
int i=0;
char m;

printf("\n请输入想查询的姓名:");
scanf("%s",s);
p1=p=a[n].next;
if(p1==NULL)
{
    printf("\n通讯录中没有此人!\n");
    return;
}
while(p->next!=NULL)
{

    while(strstr(p->data.name,s)==NULL&&p->next!=NULL)p=p->next;
    if(strstr(p->data.name,s)!=NULL)
    {
        i++;
        printf("\n类别:");
        printf("%d\n",p->data.fenlei);
        printf("姓名:");
        printf("%s\n",p->data.name);
        printf("电话:");
        printf("%s\n",p->data.tel);
        printf("电子邮件:");
        printf("%s\n",p->data.age);

        printf("QQ:");
        printf("%s\n",p->data.qq);
    }
    if((p->next==NULL)&&i==0)
    {
        printf("\n通讯录中没有此人!\n");
        printf("\n是否继续查询?(Y/N)");
        scanf("%s",&m);
        while(m!='n'&&m!='N'&&m!='y'&&m!='Y')
        {
            printf("\n输入错误!请重新输入:");
            scanf("%c",&m);
        }
        if(m!='n'&&m!='N')
        {
            namefind(a,n);
        }
        return;
    }
    if(p->next==NULL)
    {
        printf("\n查询完成!\n");
        printf("\n是否继续查询?(Y/N)");
        scanf("%s",&m);
        while(m!='n'&&m!='N'&&m!='y'&&m!='Y')
        {
            printf("\n输入错误!请重新输入:");
            scanf("%s",&m);
        }
        if(m!='n'&&m!='N')
        {
            namefind(a,n);
        }
        return;
    }
    else p=p->next;
}
if(strstr(p->data.name,s)!=NULL)
{
    i++;
    printf("\n类别:");
    printf("%d\n",p->data.fenlei);
    printf("姓名:");
    printf("%s\n",p->data.name);
    printf("电话:");
    printf("%s\n",p->data.tel);
    printf("电子邮件:");
    printf("%s\n",p->data.age);

    printf("QQ:");
    printf("%s\n",p->data.qq);
}

printf("\n查询完成!\n");
printf("\n是否继续查询?(Y/N)");
scanf("%s",&m);
while(m!='n'&&m!='N'&&m!='y'&&m!='Y')
{
    printf("\n输入错误!请重新输入:");
    scanf("%s",&m);
}
if(m!='n'&&m!='N')
{
    namefind(a,n);
}
return;

}
void onedelete1(struct LNode a[],int n)
{
char s[20],r;
int i=0;
printf("请输入想删除联系人的姓名:");
scanf("%s",s);
p1=p=a[n].next;
if(p1==NULL)
{
printf("\n通讯录中没有此人!\n");
return;
}
while(strcmp(p->data.name,s)!=0&&p->next!=NULL)p=p->next;
if(strcmp(p->data.name,s) != 0)
{
printf("\n通讯录中没有此人!\n");
return;
}
if(strcmp(p->data.name,s) == 0)
{
printf("类别:");
printf("%d\n",p->data.fenlei);
printf("姓名:");
printf("%s\n",p->data.name);
printf("电话:");
printf("%s\n",p->data.tel);
printf("电子邮件:");
printf("%s\n",p->data.age);

    printf("QQ:");
    printf("%s\n",p->data.qq);
}
printf("确认删除?(Y/N):");
scanf("%s",&r);
while(r!='n'&&r!='N'&&r!='y'&&r!='Y')
{
    printf("\n输入错误!请重新输入:");
    scanf("%s",&r);
}
if(r=='y'||r=='Y')
{
    if(p1==p)a[n].next=p->next;
    else
    {
        while(p1->next!=p)p1=p1->next;
        p1->next=p->next;
    }
    free(p);
    a[n].length--;
    printf("\n已经成功删除!\n");
    return;
}

}
//全部删除函数
void alldelete1(struct LNode a[],int n)
{
char r;

p1=p=a[n].next;
printf("\n确认删除?(Y/N):");
scanf("%s",&r);
while(r!='n'&&r!='N'&&r!='y'&&r!='Y')
{
    printf("\n输入错误!请重新输入:");
    scanf("%s",&r);
}
if(r=='y'||r=='Y')
{
    if(p1==NULL)
    {
        printf("不存在名片!");
        return;
    }
    while(p1->next!=NULL)
    {
        p=p1->next;
        p1->next=p->next;
        free(p);
    }
    a[n].next=NULL;
    a[n].length=0;
    printf("\n已经成功删除全类名片!\n");
    return;
}
if(r=='n'||r=='N')
{
    return;
}

}
//选择删除联系人函数
void delete11(struct LNode a[],int n)
{
int m;
printf("\n请选择删除方式:\n");
printf("1--单个删除 \n");
printf("2--全部删除\n");
printf("0--返回菜单\n");
printf("请选择(0-2):");
scanf("%d",&m);
while(m!=1&&m!=2&&m!=0)
{
printf("\n输入错误,请重新选择:");
scanf("%d",&m);
}
if(m==1)
{
onedelete1(a,n);
}
if(m==2)
{
alldelete1(a,n);
}
if(m==0)
{
return;
}
}
void Save()
{
FILE *fp;
int i;
if ((fp=fopen("catalog.dat","wb"))==NULL)
{
printf("\n文件打开失败");
}
for (i=1; i<=6; i++)
{
p=a[i].next;
while(p!=NULL)
{
if (fwrite(&(p->data),sizeof(struct Data),1,fp)==0)
{
printf("\n文件保存错误!\n");
}
p=p->next;
}
}
fclose(fp);
printf("\n按任意键返回主菜单:");
getch();//按任意键退出
return;
}
void namechange(struct LNode a[],int n)
{
char s[20];
char m,ch;
int i=0,k;
p1=a[n].next;
printf("\n请输入想修改的联系人的姓名:");
scanf("%s",s);
if(p1==NULL)
{
printf("\n通讯录中没有此人!\n");
printf("\n是否继续修改?(Y/N)");
scanf("%s",&ch);
while(ch!='n'&&ch!='N'&&ch!='y'&&ch!='Y')
{
printf("\n输入错误!请重新输入:");
scanf("%s",&ch);
}
if(ch!='n'&&ch!='N')
{
namechange(a,n);
}
return;
}
else
{
while((strcmp(p1->data.name,s)!=0)&&p1->next!=NULL)
p1=p1->next;

    if(p1->next ==NULL&&strcmp(p1->data.name,s) != 0)
    {
        printf("\n通讯录中没有此人!\n");
        printf("\n是否继续修改?(Y/N)");
        scanf("%s",&ch);
        while(ch!='n'&&ch!='N'&&ch!='y'&&ch!='Y')
        {
            printf("\n输入错误!请重新输入:");
            scanf("%s",&ch);
        }
        if(ch!='n'&&ch!='N')
        {
            namechange(a,n);
        }
        return;
    }
}
if(strcmp(p1->data.name,s) == 0)
{
    printf("类别:");
    printf("%d\n",p1->data.fenlei);
    printf("姓名:");
    printf("%s\n",p1->data.name);
    printf("电话:");
    printf("%s\n",p1->data.tel);
    printf("电子邮件:");
    printf("%s\n",p1->data.age);

    printf("QQ:");
    printf("%s\n",p1->data.qq);

    printf("\n1.修改姓名\n");
    printf("2.修改电话\n");
    printf("3.修改电子邮件\n");
    printf("4.修改地址\n");
    printf("5.修改QQ号\n");
    printf("0.返回菜单\n");

    printf("请您选择(0-5):");
    scanf("%d",&k);
    while(k!=1&&k!=2&&k!=3&&k!=4&&k!=5&&k!=0)
    {
        printf("\n输入错误,请重新选择:");
        scanf("%d",&k);
    }
    switch(k)
    {
    case 1:
        printf("\n请输入新的姓名:");
        scanf("%s",p1->data.name);
        break;
    case 2:
        printf("\n请输入新的电话:");
        scanf("%s",p1->data.tel);
        break;
    case 3:
        printf("\n请输入新的电子邮件:");
        scanf("%s",p1->data.age);
        break;

    case 5:
        printf("\n请输入新的QQ号:");
        scanf("%s",p1->data.qq);
        break;
    case 0:
        return;
    }
    printf("\n修改成功!\n");
    printf("\n是否继续修改?(Y/N)");
    scanf("%s",&m);
    while(m!='n'&&m!='N'&&m!='y'&&m!='Y')
    {
        printf("\n输入错误!请重新输入:");
        scanf("%c",&m);
    }
    for(; m=='y'||m=='Y';)
    {
        printf("请您选择(0-5):");
        scanf("%d",&k);
        while(k!=1&&k!=2&&k!=3&&k!=4&&k!=5&&k!=0)
        {
            printf("\n输入错误,请重新选择:");
            scanf("%d",&k);
        }
        switch(k)
        {
        case 1:
            printf("\n请输入新的姓名:");
            scanf("%s",p1->data.name);
            break;
        case 2:
            printf("\n请输入新的电话:");
            scanf("%s",p1->data.tel);
            break;
        case 3:
            printf("\n请输入新的电子邮件:");
            scanf("%s",p1->data.age);
            break;

        case 5:
            printf("\n请输入新的QQ号:");
            scanf("%s",p1->data.qq);
            break;
        case 0:
            return;
        }
        printf("\n修改成功!\n");
        printf("\n是否继续修改?(Y/N)");
        scanf("%s",&m);
        while(m!='n'&&m!='N'&&m!='y'&&m!='Y')
        {
            printf("\n输入错误!请重新输入:");
            scanf("%s",&m);
        }
    }
    if(m=='n'||m=='N');
    return;
}

}
int main()
{
int ads,asd;
Readfile();
while(1)
{
switch(ads=menu())
{
case 1:
system("cls");

        print111(a);
        break;
    case 2:
        system("cls");
        Save();
        break;
    case 3:
        system("cls");
        asd=select();
        delete11(a,asd);
        break;
    case 4:
        system("cls");
        asd=select();
        namechange(a,asd);
        break;
    case 5:
        system("cls");
        asd=select();
        input1(a,asd);
        break;
    case 6:
        system("cls");
        asd=select();
        namefind(a,asd);
        break;
    case 0:
        system("cls");
        exit(0);
    default:
        ads=menu();
    }
}

}

c

3个回答

weixin_37061400
weixin_37061400 有参考过,但是还是不知道select那里如何返回,总是把0退出当成一类了,求教,而且main函数文件保存出现问题,自动跳出,去掉break之后直接进入3又没有事,不知为何
2 年多之前 回复

你那个case 0不是直接退出程序了?

weixin_37061400
weixin_37061400 我在下一项进行前弄了个if return的值不为0 才进行下一步就解决了自己的问题了
2 年多之前 回复
liu1324457514
群居的山羊 return不是退出当前方法么
2 年多之前 回复
weixin_37061400
weixin_37061400 int select() { int c,i=1; do { printf("\n1.家人亲戚\n"); printf("2.朋友\n"); printf("3.同学\n"); printf("4.同事\n"); printf("5.陌生人\n"); printf("6.其他\n"); printf("0.返回主菜单\n"); printf("请您选择(0-6):"); scanf("%d",&c); if(c6) printf("输入错误!请重新输入:\n"); } while(c<0||c>6); if (c==0)return; else return (c); 就是这里main函数里面用了一个asd接受return的值,但是0的时候不知道怎么退出
2 年多之前 回复
liu1324457514
群居的山羊 哪能说明一下你那个"新的一类"是什么意思么?
2 年多之前 回复
weixin_37061400
weixin_37061400 不是main函数哪里,是select函数选择0返回上一项那里
2 年多之前 回复

看我的博客,C语言里有通讯录,你可以看看

weixin_37061400
weixin_37061400 我知道,但是我现在上面的代码功能基本实现了,只是有bug,选择名片分类的时候6本来是返回主菜单的,结果当成了一个新分类,而且,文件保存失败啊
2 年多之前 回复
Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!