fgets和sscanf结构导致意外结果

时间:2013-04-26 00:38:33

标签: c struct fgets scanf

我有一个我正在编写的程序,我需要从平面文件中找到一行。然后我sscanf该行将数据放入结构中。这给了我非常意想不到的结果。首先,这是一个类似于我想做的工作示例。我有一个文件department.in,如下所示:

0 something
1 else
2 more

这是一个运行示例程序,并给出了我期望的结果:

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

int main(void)
{

    FILE *in;
    in = fopen("department.in", "r");

    char * buffer = malloc(256 * sizeof(char));
    while((fgets(buffer, 256, in)) != NULL){

            int index;
            char* name;
            sscanf(buffer, "%d %s", &index, name);

            printf("\n\nIndex: %d, Name: %s.\n\n", index, name);
    }

    free(buffer);

    return 0;
}

正如预期的那样,结果如下:

Index: 0, Name: something.

Index: 1, Name: else.

Index: 2, Name: more.

然而,当我添加一个结构时,它编译得很好:

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

typedef struct{
    int index;
    char* name;
}test;

int main(void)
{

    FILE *in;
    in = fopen("department.in", "r");

    char * buffer = malloc(256 * sizeof(char));
    while((fgets(buffer, 256, in)) != NULL){

            test *mytest = malloc(sizeof(test));

            sscanf(buffer, "%d %s", &mytest->index, mytest->name);

            printf("\n\nIndex: %d, Name: %s.\n\n", mytest->index, mytest->name);
            free(mytest);
    }
    free(buffer);
    return 0;
}

结果不是我所期望的:

Index: 0, Name: (null).

Index: 1, Name: (null).

Index: 2, Name: (null).

显然我对我的炭烬做错了,但我对我的生活无法弄清楚是什么。当我改变某些事情时,它甚至会出错。任何帮助将不胜感激!

P.S。这不是功课。我刚刚制作了一个更简化的实际代码示例,以便于阅读和编译,以及学习我需要的这个概念。再次感谢!

1 个答案:

答案 0 :(得分:2)

将存储空间分配给mytest->name。输出告诉您指针为NULL。

mytest->name = malloc(256); /* sizeof(char) is always 1, by definition */

或者你可以用数组替换指针。

typedef struct{
    int index;
    char name[256];
}test;
顺便说一下,做一个简单的例子做得很好。