gpt4 book ai didi

c - 结构体数组的动态分配不起作用

转载 作者:行者123 更新时间:2023-11-30 14:32:50 25 4
gpt4 key购买 nike

我正在尝试动态分配结构数组,但每次读取结构数据时,它都会在打印语句之前打印一些随机字符。例如,如果输入 JOHN 作为名字,它将在 print 语句之前打印 J O,有时还会跳过一些 scanf 语句。代码如下:

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

int main()
{
struct DEP
{
char name[30];
char rank;
int number;

};
struct DEP *members;
int size, i;

scanf("%d", &size);
members = malloc(size * sizeof(struct DEP));
if(members == NULL)
{
return 1;
}

for(i = 0;i < size;i++)
{
fgets(members[i].name, 30, stdin);
members[i].name[strcspn(members[i].name, "\n")] = '\0';
scanf("%c %d", &members[i].rank, &members[i].number);
printf("%s\n%c\n%d\n", members[i].name, members[i].rank, members[i].number);
}


return 0;
}

输入示例:

最佳答案

抱歉,但我在运行时在您的代码中添加了一些打印语句。

我做了下面的操作来消除 scanf 之后留在缓冲区中的 '\n' ;这给我带来了很好的结果。我认为这就是问题的根源。不干净的缓冲区。

int c;
while ((c=getchar()) != '\n' && c != EOF);

修改程序如下。

#include <stdlib.h>
#include <string.h>

int main()
{
struct DEP
{
char name[30];
char rank;
int number;

};
struct DEP *members;
int size, i, c;

scanf("%d", &size);
members = malloc(size * sizeof(struct DEP));
if(members == NULL)
{
return 1;
}

while ((c = getchar()) != '\n' && c != EOF);
for(i = 0;i < size;i++)
{
printf ("Enter Name: \n");
fgets(members[i].name, 30, stdin);
members[i].name[strcspn(members[i].name, "\n")] = '\0';
printf ("Enter rank and number: ");
scanf("%c %d", &members[i].rank, &members[i].number);
while ((c = getchar()) != '\n' && c != EOF);
printf("Name: %s\nRank: %c\nNum: %d\n", members[i].name, members[i].rank, members[i].number);
}


return 0;
}

得到以下输出--

$ ./main.out
3
Enter Name:
siddharth
Enter rank and number: z 5
Name: siddharth
Rank: z
Num: 5
Enter Name:
sid
Enter rank and number: s 6
Name: sid
Rank: s
Num: 6
Enter Name:
sidhh
Enter rank and number: e 8
Name: sidhh
Rank: e
Num: 8

关于c - 结构体数组的动态分配不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59662134/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com