【发布时间】:2021-01-14 14:09:44
【问题描述】:
我对 C 语言非常陌生,我正在尝试从包含姓名和电话号码的文件中逐行读取。然后我需要动态分配一个结构数组,并用文件中的名称和编号填充该数组。这很有效,当我在执行此操作的函数中打印出来时效果很好,但是当我返回结构并尝试在main 中打印时,它会在框中打印问号。
这是文件的样子:
亚伦 7774013 乔恩 7774014 托马斯 7774015 马特 7774016这些是相关的代码部分(如果您需要查看更多信息,请告诉我):
struct _data {
char *name;
long number;
};
struct _data *LOAD(FILE *stream, int size) {
char str[50];
char *token;
int i;
struct _data *BlackBox = calloc(size, sizeof(struct _data));
stream = fopen("hw4.data.txt", "r");
for (i = 0; i < size; i++) {
if (fgets(str, 50, stream) != NULL) {
token = strtok(str, " ");
BlackBox[i].name = token;
printf("%s\n", BlackBox[i].name); //prints just fine
puts(token);
while (token != NULL) {
token = strtok(NULL, " ");
BlackBox[i].number = atoi(token);
break;
}
}
}
fclose(stream);
return BlackBox;
}
这是在main 函数中
FILE *stream;
int size = scan(&stream);
struct _data *BlackBox = LOAD(stream, size);
for (i = 0; i < size; i++) {
printf("%s\n", BlackBox[i].name); //prints out garbage
}
【问题讨论】:
-
token = strtok(str, " "); BlackBox[i].name = token;不正确,因为str是一个局部变量。一旦函数退出,它就会失效。分配动态内存,然后将字符串复制到缓冲区中(或使用strdup作为快捷方式)。 -
此外,您将相同的
str分配给多个BlackBox条目。不可能每个条目都有不同的字符串值 - 作为测试,在for循环之后的循环中执行printf,你会看到。