我有一个我正在编写的程序,我需要从平面文件中找到一行。然后我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。这不是功课。我刚刚制作了一个更简化的实际代码示例,以便于阅读和编译,以及学习我需要的这个概念。再次感谢!
答案 0 :(得分:2)
将存储空间分配给mytest->name
。输出告诉您指针为NULL。
mytest->name = malloc(256); /* sizeof(char) is always 1, by definition */
或者你可以用数组替换指针。
typedef struct{
int index;
char name[256];
}test;
顺便说一下,做一个简单的例子做得很好。