【问题标题】:Dynamic allocation of an array of structs does not work结构数组的动态分配不起作用
【发布时间】: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", &amp;temp3); 不会读取您可能在输入后按下的Enter 添加的换行符。想想当fgets 读取的第一个字符是换行符时会发生什么。
  • 顺便说一下,你不需要你的temp变量,你可以直接读入结构成员,如scanf("%d", &amp;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() 语句正在比较sizei,因此,这一行应该是: int temp3; size_t size, i;

标签: c struct


【解决方案1】:

抱歉,我在你的代码中添加了一些打印语句,同时在我最后运行时。

我做了下面的事情来摆脱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

【讨论】:

    猜你喜欢
    • 2019-07-19
    • 2020-03-06
    • 2021-10-30
    • 2017-03-30
    • 1970-01-01
    • 2012-03-25
    • 2011-12-13
    相关资源
    最近更新 更多