我正在尝试编写代码以将患者添加到列表中。这是一个很大的代码,但是我在输入患者姓名的特定部分上遇到了问题。我可以正确输入名称,但是当我尝试将代码放入交换机/机箱中时,它便无法正常工作。我想知道这里有人可以帮忙吗?
最初,我认为可能是malloc导致了此问题,但如果不使用switch / case,它似乎可以正常工作。
代码:
#include <stdio.h>
#include <stdlib.h>
typedef unsigned long int u32;
typedef unsigned char u8;
typedef struct Patient patient;
struct Patient
{
u8* name;
patient* next;
};
void addfirstpatient(u8* name);
void addpatient(u8* name);
void print (void);
patient* head;
u8 length = 0;
int main()
{
u32 x = 1;
switch(x)
{
u8* name = malloc(20*sizeof(u8));
case 1:
printf("\nPlease enter patient name:");
scanf("%s",name);
if(length == 0)
{
addfirstpatient(name);
}
else
{
addpatient(name);
}
print();
printf("\nPatient added , Thank you\n");
printf("\nTo add another patient press 1");
scanf("%d",&x);
break;
case 2:
break;
default:
printf("\nentered default");
}
return 0;
}
void addfirstpatient(u8* name)
{
printf("\nadding first patient: ");
head = (patient*)malloc(sizeof(patient));
head->next = NULL;
head->name = name;
length++;
}
void addpatient(u8* name)
{
patient* ptr = head;
while((ptr->next)!=NULL)
{
ptr = ptr->next;
}
printf("\nadding patient");
ptr->next = (patient*)malloc(sizeof(patient));
(ptr->next)->next = NULL;
(ptr->next)->name = name;
length++;
}
void print (void)
{
patient *ptr = head;
u32 count = 1;
printf("\n---------------------");
if (ptr == NULL)
{
printf ("\nList is empty");
}
while (ptr!=NULL)
{
printf("\npatient Number %d\nname:%s" ,count,ptr->name);
ptr = ptr->next;
count++;
}
printf("\n---------------------");
printf("\n");
}
答案 0 :(得分:2)
switch(x)
{
u8* name = malloc(20*sizeof(u8));
case 1:
不合法-编译时感到惊讶(也许不是,也许就是您的错误)。您需要
u8* name = malloc(20*sizeof(u8));
switch(x)
{
case 1:
或者也许
u8* name = NULL;
switch(x)
{
case 1:
name = malloc(20*sizeof(u8));
取决于您希望何时分配该数组
当然,您应该检查malloc的返回。
答案 1 :(得分:2)
尽管您的建筑...
switch(x) { u8* name = malloc(20*sizeof(u8)); case 1:
...从技术上讲是合法的,它无法实现您想要的。它确实声明了变量name
,该变量位于switch
主体的整个范围内,但是执行总是跳到case
或default
标签是否完全进入主体,因此将永远不会评估初始化程序(包含malloc()
的调用),也不会为变量name
分配初始值。
实际操作方式取决于您要完成的工作。如果只希望在一个name
中使用变量case
,则在此处声明和初始化它可能更有意义,但是您不能在标签后立即这样做。您可以将其放在自己的块中,也可以在它们之间放置可执行语句,
switch(x) {
case 1: {
u8* name = malloc(20*sizeof(u8));
// ...
}
// ...
如果要在多个case
中使用它,那么最好在switch
之外声明它:
u8* name = malloc(20*sizeof(u8));
switch(x) {
case 1:
// ...
如果将声明保留在原处,则必须在使用它之前,在适当的case
标签之后,在之后为其分配一个值:
switch(x) {
u8* name;
case 1:
name = malloc(20*sizeof(u8));
// ...
但是,我建议您不要选择这种方法,因为它的风格很差。