【发布时间】:2016-04-19 23:24:57
【问题描述】:
我的代码在第二个数据结构中跳过第一个问题时遇到问题。我很确定这是因为gets(),但不确定。我想我尝试了 fgets(),但它仍然给我带来了问题。为什么?
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define NumberOfActresses 5
typedef struct Actress
{
char *name, *placeofbirth, *haircolor;
int age;
float networth;
struct Actress *next;
} Actress;
void PopulateStruct(Actress *node)
{
node->name = (char *) malloc(sizeof(char) * 50);
node->placeofbirth = (char *) malloc(sizeof(char) * 50);
node->haircolor = (char *) malloc(sizeof(char) * 50);
printf("Please enter the name of the actress/actor: ");
gets(node->name);
printf("Please enter the actress/actor place of birth: ");
gets(node->placeofbirth);
printf("Please enter the actress/actor hair color: ");
gets(node->haircolor);
printf("Please enter the actress/actor age: ");
scanf("%d", &node->age);
printf("Please enter the actress/actor networth: ");
scanf("%f", &node->networth);
}
void DisplayStruct(Actress *head)
{
Actress *crawler;
crawler = head;
while(crawler != NULL)
{
printf("The name of the actress/actor is: %s\n", crawler->name);
printf("The place of birth for the actress/actor is: %s\n", crawler->placeofbirth);
printf("The hair color of the actress/actor is: %s\n", crawler->haircolor);
printf("The actress/actor age is: %d\n", crawler->age);
printf("The networth for the actress/actor is %f\n", crawler->networth);
crawler = crawler->next;
}
}
int main()
{
int i;
Actress *head = (Actress *) malloc(sizeof(Actress)), *crawler;
crawler = head;
for (i = 0; i < NumberOfActresses; i++)
{
PopulateStruct(crawler);
if (i == 2)
crawler->next = NULL;
else
crawler->next = malloc(sizeof(Actress));
crawler = crawler->next;
}
crawler = NULL;
DisplayStruct(head);
return 0;
}
【问题讨论】:
-
scanf("%f", &node->networth);-->scanf("%f%*c", &node->networth);%*c消耗剩余的换行符。还有if (i == 2)-->if (i == 4)? -
混合
fgets和scanf总是很糟糕。使用gets是完全错误的。 -
@BLUEPIXY 抱歉,if 语句应该是 if(I == NumberOfActresses - 1)。使用 %*c 可以解决这个问题,还是我应该使用其他东西?
-
@user3386109 那我应该用什么?
-
我认为这按预期工作。如果强行说,请确保更好地释放内存(
free'ed)。
标签: c data-structures linked-list