【发布时间】:2020-04-26 22:48:11
【问题描述】:
我正在尝试动态分配一个结构数组,但每次我读取结构的数据时,它都会在打印语句之前打印一些随机字符。例如,如果输入 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("%d", &temp3);不会读取您可能在输入后按下的Enter添加的换行符。想想当fgets读取的第一个字符是换行符时会发生什么。 -
顺便说一下,你不需要你的
temp变量,你可以直接读入结构成员,如scanf("%d", &members[i].number); -
检查
scanf()的返回值会告诉你它是否成功读取任何数据。 -
关于:
if(members == NULL) { return 1;代码应始终告知用户正在发生的事情。尤其是发生错误时。此类错误消息应输出到stderr。当错误来自 C 库函数时,还应输出(到stderr)系统认为发生错误的文本原因。函数:perror()就是为此目的而创建的。建议:if(members == NULL) { perror( "malloc failed" ); return 1; } -
关于:
int size, i, temp3;对malloc()的调用需要一个类型为:size_t的参数,而for()语句正在比较size和i,因此,这一行应该是:int temp3; size_t size, i;