鱼C论坛

 找回密码
 立即注册
查看: 1509|回复: 5

[已解决]我又来了。。————求助!

[复制链接]
发表于 2023-4-8 22:39:46 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
今天学完单链表用单链表的方式做之前的题,但是还是遇到一个类似之前的问题!
录入完第一个人资料 录第二个人资料就会有卡住 有问题。。求助

#include<stdio.h>
#include <stdlib.h>

struct Ym
{
        char name[8];
        int age;
        char one_time[11];
        char two_time[11];
        struct Ym *next;

};

getInput(struct Ym *ym)
{
        
        char ch; 
        printf("请输入姓名:");
        scanf("%s",ym->name);
        printf("请输入年龄:");
        scanf("%d",ym->age);
        while ((ch = getchar()) != '\n' && ch != EOF); // 添加这行以清空输入缓冲区

    printf("请问是否接种过疫苗(Y/N):");


        
        if((ch = getchar()) == 'Y')
        {
                printf("请输入第一针疫苗接种的日期(yyyy-mm-dd):");
                scanf("%s",ym->one_time);
                
        }
        else
        {
                ym->one_time[0] = '0';
                return ;
        }
        
        while ((ch = getchar()) != '\n' && ch != EOF); // 添加这行以清空输入缓冲区

        printf("请问是否接种过第二针疫苗(Y/N):");
                
                 if((ch = getchar()) == 'Y')
        {
        
                printf("请输入第二针疫苗接种的日期(yyyy-mm-dd):");
                scanf("%s",ym->two_time);
        }
        else
        ym->two_time[0] = '0';
        
}


void addYm(struct Ym **library)
{
        struct Ym *ym, *temp;
        ym = (struct Ym*)malloc(sizeof(struct Ym));
        if(ym == NULL)
        {
                printf("内存分配失败了!\n");
                exit(1); 
        }
        
        getInput(ym);
        
        if(*library != NULL)
        {
                temp = *library;
                *library = ym;
                ym->next = temp;
                
        }
        else
        {
                *library = ym;
                ym->next = NULL;
        }
        
        
}

        
void printLibrary(struct Ym *library)
{
        struct Ym *ym;
//        int count = 1;
        
        ym = library;
        while(ym != NULL)
        {
                printf("姓名:%s        ",ym->name);
                printf("年龄:%d",ym->age);
                 if(ym->one_time[0] != '0')
        printf("第一针疫苗接种日期:%s,",ym->one_time);
        else
        {
            printf("未接种疫苗!");
        }
        if(ym->two_time[0] != '0')
        printf("第二针疫苗接种日期:%s\n\n",ym->two_time);
        else
        printf("未接种第二针疫苗!\n\n");
        
                ym = ym->next;
                //count++;
        }
} 

void releaseLibrary(struct Ym *library)
{
        struct Ym *temp;
   
        while (library != NULL)
        {
                temp = library;
                library = library->next;
                free(temp);
        }
}




int main(void)
{
        struct Ym *library = NULL;
        char ch;
        
        while(1)
        {
                printf("请问是否需要录入疫苗信息(Y/N):");
                do
                {
                        ch = getchar();
                }
                while(ch != 'Y' && ch != 'N');

                if(ch == 'Y')
                {
                        addYm(&library); //如果用library是指向空间的地址 用&library是library指针本身的地址 
                        
        
                }
                else
                {
                        break;
                }
        }

        printf("请问是否需要打印疫苗信息(Y/N):");
        do
        {
                ch = getchar();
        }
        while(ch != 'Y' && ch != 'N');
        
        if(ch == 'Y')
        {
                printLibrary(library);
        }
        releaseLibrary(library);
        
        return 0;
}
最佳答案
2023-4-8 23:26:01
本帖最后由 isdkz 于 2023-4-8 23:31 编辑
a905448839 发表于 2023-4-8 23:20
是我这个修改后的代码能够录入多个人员的数据吗? 我尝试了很多次都不行。。。


暂且称你修改前的代码为第一个代码,修改后的为第二个代码,我给你解释以下只能输出一个数据的原因:

在第二个代码的 printLibrary 函数中,当第一个疫苗未接种时,程序会直接跳到下一个记录,这是因为使用了 break 语句。

实际上,应该使用 continue 语句,以便跳过当前记录的剩余部分并继续处理下一个记录。以下是修复后的第二个代码中的 printLibrary 函数的相关部分:
else
{
    printf("未接种疫苗!");
    ym = ym->next;
    continue;
}

将 break 语句替换为 continue 语句后,第二个代码应该可以正确地输出所有已录入的信息。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2023-4-8 22:41:56 | 显示全部楼层
你好!我发现你在 getInput 函数中调用 scanf() 函数时,ym->age 需要传递一个整数指针,而不是整数本身。请将 scanf("%d",ym->age); 更改为 scanf("%d",&ym->age);。

下面是修改后的 getInput() 函数:

void getInput(struct Ym *ym)
{
        char ch;
        printf("请输入姓名:");
        scanf("%s",ym->name);
        printf("请输入年龄:");
        scanf("%d",&ym->age); // 这里修改了
        while ((ch = getchar()) != '\n' && ch != EOF); // 添加这行以清空输入缓冲区

        // ... 其他代码保持不变 ...
}

使用上述修改后的 getInput() 函数,程序应该可以正常运行并录入多个人的资料。如果还有其他问题,请随时告诉我!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2023-4-8 23:05:49 | 显示全部楼层
isdkz 发表于 2023-4-8 22:41
你好!我发现你在 getInput 函数中调用 scanf() 函数时,ym->age 需要传递一个整数指针,而不是整数本身。 ...

修改后 为什么只录入了最后一个人的数据呢?
#include<stdio.h>
#include <stdlib.h>

struct Ym
{
        char name[8];
        int age;
        char one_time[11];
        char two_time[11];
        struct Ym *next;

};

void getInput(struct Ym *ym)
{
        
        char ch; 
        printf("请输入姓名:");
        scanf("%s",ym->name);
        printf("请输入年龄:");
        scanf("%d",&ym->age);
        while ((ch = getchar()) != '\n' && ch != EOF); // 添加这行以清空输入缓冲区

    printf("请问是否接种过疫苗(Y/N):");


        
        if((ch = getchar()) == 'Y')
        {
                printf("请输入第一针疫苗接种的日期(yyyy-mm-dd):");
                scanf("%s",ym->one_time);
                
        }
        else
        {
                ym->one_time[0] = '0';
                printf("\n\n");
                return ;
        }
        
        while ((ch = getchar()) != '\n' && ch != EOF); // 添加这行以清空输入缓冲区

        printf("请问是否接种过第二针疫苗(Y/N):");
                
                 if((ch = getchar()) == 'Y')
        {
        
                printf("请输入第二针疫苗接种的日期(yyyy-mm-dd):");
                scanf("%s",ym->two_time);
        }
        else
        ym->two_time[0] = '0';
        
        //while ((ch = getchar()) != '\n' && ch != EOF); // 添加这行以清空输入缓冲区
                printf("\n\n");
        
}


void addYm(struct Ym **library)
{
        struct Ym *ym, *temp;
        ym = (struct Ym*)malloc(sizeof(struct Ym));
        if(ym == NULL)
        {
                printf("内存分配失败了!\n");
                exit(1); 
        }
        
        getInput(ym);
        
        if(*library != NULL)
        {
                temp = *library;
                *library = ym;
                ym->next = temp;
                
        }
        else
        {
                *library = ym;
                ym->next = NULL;
        }
        
        
}

        
void printLibrary(struct Ym *library)
{
        struct Ym *ym;
//        int count = 1;
        
        ym = library;
        while(ym != NULL)
        {
                printf("姓名:%s        ",ym->name);
                printf("年龄:%d\n",ym->age);
                
                 if(ym->one_time[0] != '0')
        printf("第一针疫苗接种日期:%s,        ",ym->one_time);
        else
        {
            printf("未接种疫苗!");
            ym = ym->next;
            break; 
           
        }
       
            if(ym->one_time[0] != '0' && ym->two_time[0] != '0')
        printf("第二针疫苗接种日期:%s\n\n",ym->two_time);
        else
        {
                        printf("未接种第二针疫苗!\n\n");
         
                }
                ym = ym->next; //指向下一个结构体  就可以跳出循环了 
                        //count++;
        }
} 

void releaseLibrary(struct Ym *library)
{
        struct Ym *temp;
   
        while (library != NULL)
        {
                temp = library;
                library = library->next;
                free(temp);
        }
}



int main(void)
{
        struct Ym *library = NULL;
        char ch;
        
        while(1)
        {
                printf("请问是否需要录入疫苗信息(Y/N):");
                do
                {
                        ch = getchar();
                }
                while(ch != 'Y' && ch != 'N');

                if(ch == 'Y')
                {
                        addYm(&library); //如果用library是指向空间的地址 用&library是library指针本身的地址 
                        
        
                }
                else
                {
                        printf("\n");
        
                        break;
                }
        }

        printf("请问是否需要打印疫苗信息(Y/N):");
        do
        {
                ch = getchar();
        }
        while(ch != 'Y' && ch != 'N');
        
        if(ch == 'Y')
        {
                printLibrary(library);
        }
        releaseLibrary(library);
        
        return 0;
}
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-4-8 23:09:28 | 显示全部楼层
a905448839 发表于 2023-4-8 23:05
修改后 为什么只录入了最后一个人的数据呢?

录入的信息都有呀

截图20230408230854.png
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2023-4-8 23:25:23 | 显示全部楼层
isdkz 发表于 2023-4-8 23:09
录入的信息都有呀

是我这个修改后的代码能够录入多个人员的数据吗? 我尝试了很多次都不行。。。
#include<stdio.h>
#include <stdlib.h>

struct Ym
{
        char name[8];
        int age;
        char one_time[11];
        char two_time[11];
        struct Ym *next;

};

void getInput(struct Ym *ym)
{
        
        char ch; 
        printf("请输入姓名:");
        scanf("%s",ym->name);
        printf("请输入年龄:");
        scanf("%d",&ym->age);
        while ((ch = getchar()) != '\n' && ch != EOF); // 添加这行以清空输入缓冲区

    printf("请问是否接种过疫苗(Y/N):");


        
        if((ch = getchar()) == 'Y')
        {
                printf("请输入第一针疫苗接种的日期(yyyy-mm-dd):");
                scanf("%s",ym->one_time);
                
        }
        else
        {
                ym->one_time[0] = '0';
                printf("\n\n");
                return ;
        }
        
        while ((ch = getchar()) != '\n' && ch != EOF); // 添加这行以清空输入缓冲区

        printf("请问是否接种过第二针疫苗(Y/N):");
                
                 if((ch = getchar()) == 'Y')
        {
        
                printf("请输入第二针疫苗接种的日期(yyyy-mm-dd):");
                scanf("%s",ym->two_time);
        }
        else
        ym->two_time[0] = '0';
        
        //while ((ch = getchar()) != '\n' && ch != EOF); // 添加这行以清空输入缓冲区
                printf("\n\n");
        
}


void addYm(struct Ym **library)
{
        struct Ym *ym, *temp;
        ym = (struct Ym*)malloc(sizeof(struct Ym));
        if(ym == NULL)
        {
                printf("内存分配失败了!\n");
                exit(1); 
        }
        
        getInput(ym);
        
        if(*library != NULL) //可以分开看 * (*library)看成一个整体 这个代表**library指针指向空间的地址
        {
                temp = *library;
                *library = ym;
                ym->next = temp;
                
        }
        else
        {
                *library = ym;
                ym->next = NULL;
        }
        
        
}

        
void printLibrary(struct Ym *library)
{
        struct Ym *ym;
//        int count = 1;
        
        ym = library;
        while(ym != NULL)
        {
                printf("姓名:%s        ",ym->name);
                printf("年龄:%d\n",ym->age);
                
                 if(ym->one_time[0] != '0')
        printf("第一针疫苗接种日期:%s,        ",ym->one_time);
        else
        {
            printf("未接种疫苗!");
            ym = ym->next;
            break; 
           
        }
       
            if(ym->one_time[0] != '0' && ym->two_time[0] != '0')
        printf("第二针疫苗接种日期:%s\n\n",ym->two_time);
        else
        {
                        printf("未接种第二针疫苗!\n\n");
         
                }
                ym = ym->next; //指向下一个结构体  就可以跳出循环了 
                        //count++;
        }
} 

void releaseLibrary(struct Ym *library)
{
        struct Ym *temp;
   
        while (library != NULL)
        {
                temp = library;
                library = library->next;
                free(temp);
        }
}



int main(void)
{
        struct Ym *library = NULL;
        char ch;
        
        while(1)
        {
                printf("请问是否需要录入疫苗信息(Y/N):");
                do
                {
                        ch = getchar();
                }
                while(ch != 'Y' && ch != 'N');

                if(ch == 'Y')
                {
                        addYm(&library); //如果用library是指向空间的地址 用&library是library指针本身的地址 
                        
        
                }
                else
                {
                        printf("\n");
        
                        break;
                }
        }

        printf("请问是否需要打印疫苗信息(Y/N):");
        do
        {
                ch = getchar();
        }
        while(ch != 'Y' && ch != 'N');
        
        if(ch == 'Y')
        {
                printLibrary(library);
        }
        releaseLibrary(library);
        
        return 0;
}
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-4-8 23:26:01 | 显示全部楼层    本楼为最佳答案   
本帖最后由 isdkz 于 2023-4-8 23:31 编辑
a905448839 发表于 2023-4-8 23:20
是我这个修改后的代码能够录入多个人员的数据吗? 我尝试了很多次都不行。。。


暂且称你修改前的代码为第一个代码,修改后的为第二个代码,我给你解释以下只能输出一个数据的原因:

在第二个代码的 printLibrary 函数中,当第一个疫苗未接种时,程序会直接跳到下一个记录,这是因为使用了 break 语句。

实际上,应该使用 continue 语句,以便跳过当前记录的剩余部分并继续处理下一个记录。以下是修复后的第二个代码中的 printLibrary 函数的相关部分:
else
{
    printf("未接种疫苗!");
    ym = ym->next;
    continue;
}

将 break 语句替换为 continue 语句后,第二个代码应该可以正确地输出所有已录入的信息。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-12-23 21:56

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表