我又来了。。————求助!
今天学完单链表用单链表的方式做之前的题,但是还是遇到一个类似之前的问题!录入完第一个人资料 录第二个人资料就会有卡住 有问题。。求助
#include<stdio.h>
#include <stdlib.h>
struct Ym
{
char name;
int age;
char one_time;
char two_time;
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';
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';
}
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')
printf("第一针疫苗接种日期:%s,",ym->one_time);
else
{
printf("未接种疫苗!");
}
if(ym->two_time != '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;
}
你好!我发现你在 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() 函数,程序应该可以正常运行并录入多个人的资料。如果还有其他问题,请随时告诉我! isdkz 发表于 2023-4-8 22:41
你好!我发现你在 getInput 函数中调用 scanf() 函数时,ym->age 需要传递一个整数指针,而不是整数本身。 ...
修改后 为什么只录入了最后一个人的数据呢?
#include<stdio.h>
#include <stdlib.h>
struct Ym
{
char name;
int age;
char one_time;
char two_time;
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';
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';
//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')
printf("第一针疫苗接种日期:%s, ",ym->one_time);
else
{
printf("未接种疫苗!");
ym = ym->next;
break;
}
if(ym->one_time != '0' && ym->two_time != '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;
}
a905448839 发表于 2023-4-8 23:05
修改后 为什么只录入了最后一个人的数据呢?
录入的信息都有呀
isdkz 发表于 2023-4-8 23:09
录入的信息都有呀
是我这个修改后的代码能够录入多个人员的数据吗? 我尝试了很多次都不行。。。
#include<stdio.h>
#include <stdlib.h>
struct Ym
{
char name;
int age;
char one_time;
char two_time;
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';
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';
//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')
printf("第一针疫苗接种日期:%s, ",ym->one_time);
else
{
printf("未接种疫苗!");
ym = ym->next;
break;
}
if(ym->one_time != '0' && ym->two_time != '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;
}
本帖最后由 isdkz 于 2023-4-8 23:31 编辑
a905448839 发表于 2023-4-8 23:20
是我这个修改后的代码能够录入多个人员的数据吗? 我尝试了很多次都不行。。。
暂且称你修改前的代码为第一个代码,修改后的为第二个代码,我给你解释以下只能输出一个数据的原因:
在第二个代码的 printLibrary 函数中,当第一个疫苗未接种时,程序会直接跳到下一个记录,这是因为使用了 break 语句。
实际上,应该使用 continue 语句,以便跳过当前记录的剩余部分并继续处理下一个记录。以下是修复后的第二个代码中的 printLibrary 函数的相关部分:
else
{
printf("未接种疫苗!");
ym = ym->next;
continue;
}
将 break 语句替换为 continue 语句后,第二个代码应该可以正确地输出所有已录入的信息。
页:
[1]