0

我必须制作一个程序,将 a 和 b 作为输入,将以下形式的行数“a”作为输入:“studentId studentName studentPhone”和“stId mark1 mark2 mark3”形式的 b 行输入。然后程序从第一个输入输出所有 stid,如果输入 b 中存在相同的 id,则程序输出除其 id 之外的学生标记。

我经历了地狱才能正确输入,我认为这很接近但我得到了一个奇怪的行为:在我在第二个输入中输入标记后,似乎第一个输入中的一些学生 ID 已更改。

这是我的代码:(在这里我尝试只输入学生证。http: //ideone.com/dBYzwe

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


void chomp(char *s);

struct listA{
    int stId;
    char stName[19];
    char stPhone[12];

    };

struct listB{
    int stId;
    char marks[11];

};


int main(void) {
    int i, j, m, n;

    scanf("%d%d", &m, &n);

struct listA *a = malloc(sizeof(m * sizeof(struct listA)));
    struct listB *b = malloc(sizeof(n * sizeof(struct listB)));

    for(i = 0; i < m; i++)
    {
        scanf("%d", &a[i].stId);
        fgets(a[i].stName, 19, stdin);
        fgets(a[i].stPhone, 11, stdin);
        chomp(a[i].stName);
        chomp(a[i].stPhone);

    }
    for(i = 0; i < m; i++)
            printf("%d ", a[i].stId);


    for(i = 0; i < n; i++)
    {
        scanf("%d ", &b[i].stId);
        fgets(b[i].marks, 12, stdin);
        fflush(stdin);
    }

    printf("\n");


        for(i = 0; i < n; i++)
    {
        printf("%d ", b[i].stId);
    }


    printf("\n");

    for(i = 0; i < m; i++)
            printf("%d ", a[i].stId);




    return 0;









}
void chomp(char *s) {
    while(*s && *s != '\n' && *s != '\r') s++;

    *s = 0;
}
4

3 回答 3

1

问题出在

struct listA *a = malloc(sizeof(m * sizeof(struct listA)));
struct listB *b = malloc(sizeof(n * sizeof(struct listB)));

结果m * sizeof(struct listA)是一个整数,所以当你把它放进去时,sizeof你会得到整数的大小,而不是你想要的数字。您应该将其更改为:

struct listA *a = malloc(m * sizeof(struct listA));
struct listB *b = malloc(n * sizeof(struct listB));
于 2013-11-11T19:53:18.150 回答
1

第一个问题是您的内存分配错误(这可能是您问题的解决方案,也可能不是,但这绝对是您必须解决的问题)。

Malloc 将要分配的内存字节数作为参数,并返回指向已分配内存的指针,如果失败则返回 null。

正如您现在所做的那样struct listA *a = malloc(sizeof(*a));,您为对象分配空间(您已将 a 声明为指向对象的指针,并分配 a 的对象字节的大小)。您需要为具有 n*sizeof(*a) 字节的对象数组分配内存,并保持您编写它的方式。您应该检查 malloc 是否返回 null。

另外,请注意您可能会超出 stPhone/stName/marks 大小。

使用 fflush 是一种不好的做法,除非你真的需要它,尤其是在输入流上: http: //www.gidnetwork.com/b-57.html

fgets(b[i].marks, 12, stdin);

您确定带标记的行最多有 12 个字符吗?我建议使用另一种读取输入的方式,如下所述:How to read from input until newline is found using scanf()?

于 2013-11-11T19:56:23.333 回答
0

您应该为a和分配足够的内存b

struct listA *a = malloc(sizeof(*a)* m);
struct listB *b = malloc(sizeof(*b) * n);

使用您的代码进行适当的分配。

于 2013-11-11T19:53:30.507 回答