所以我一直在尝试使程序的这一部分读取特定文件,其中包含这种格式的名称和数字
姓名
等并将它们存储在结构列表中
to-report occurrences [#x #the-list]
report reduce
[ [occurrence-count next-item] -> ifelse-value (next-item = #x)
[occurrence-count + 1] [occurrence-count] ] (fput 0 #the-list)
end
void read_data(char *filename, list *mylist) {
FILE *file = fopen(filename, "r");
if (file == NULL) {
printf("Can't open file\n");
exit (1);
}
char pass[100];
int order;
char line[1000];
while (fgets(line, 1000, file) != NULL) {
list_element *element = malloc(sizeof(list_element));
sscanf(line, "%s %d", pass, &order);
sprintf(element->password, "%s", pass);
element->count = order;
element->next = NULL;
insert_front(element, mylist);
}
fclose(file);
}
不断因分段错误而使程序崩溃。我尝试过sprintf
,但仍然遇到同样的问题。
我无法使用缓冲区,因为在此特定任务中,我不允许使用snprintf
,因此<string.h>
不是一个选择
结构本身是:
strcpy
Valgrind显示:
struct list_element {
char *password;
int count;
list_element* next;
};
任何有关我的错误发生的地方的技巧,我们都会感谢:)
答案 0 :(得分:2)
对于list_element* element = malloc(sizeof(list_element));
,您正在为list元素分配空间,但没有为成员password
所指向的密码分配空间。因此,您的sprintf(element->password,"%s", pass);
将写入尚未分配的内存。
在sprintf
之前分配空间(顺便说一句,strcpy
也可以完成此工作):
element->password = malloc(strlen(pass)+1);
// sprintf(element->password,"%s", pass);
strcpy(element->password,pass);
或写...
element->password = strdup(pass);
在将pass
的内容复制到该空间之前,要保留足够的空间来容纳pass
的内容。