在这里,我试图逐行读取文件的内容,并为每一行创建一个结构。问题是当我打印单词列表时,它们中的每一个都是文件的最后一个单词(在此示例中为})。我相信,因为行经常更改,我传递指向char的指针,每个结构的值也会发生变化。我一直试图解决这个问题将近一天没有任何运气。将每个单词读入结构并将每个结构链接到链表的好方法是什么?
请注意,下面使用了一些辅助方法。我已多次测试它们并且它们正在工作。
令牌结构
typedef struct token
{
char* value;
struct token* next;
}TOKEN;
文件内容
target1:
dependency1
{
command1,
command2
}
主要
TOKEN *head = NULL;
// represents each formatted line from the script file
char* line = malloc(161*sizeof(char));
FILE* fileRead = openFile("RawRules.txt", "r");
while((line = readLine(line, fileRead)) != NULL)
{
head = add(head, line);
}
displaylist(head);
freeNodes(head);
fclose(fileRead);
添加功能从http://cprogramminglanguage.net/singly-linked-list-c-source-code.aspx修改
TOKEN* add(TOKEN *head, char* value){
TOKEN *tmp;
if(head == NULL){
head=(TOKEN *)malloc(sizeof(TOKEN));
if(head == NULL){
printf("Error! memory is not available\n");
exit(0);
}
head-> value = value;
head-> next = head;
}else{
tmp = head;
while (tmp-> next != head)
tmp = tmp-> next;
tmp-> next = (TOKEN *)malloc(sizeof(TOKEN));
if(tmp -> next == NULL)
{
printf("Error! memory is not available\n");
exit(0);
}
tmp = tmp-> next;
tmp-> value = value;
tmp-> next = head;
}
return head;
}
readline功能
// reads a line of a file into buffer
char* readLine(char* buffer, FILE* file) {
buffer = fgets(buffer, 161, file);
return buffer;
}
这无法解决问题
while(true)
{
char* ll = malloc(161*sizeof(char));
ll = readLine(ll, fileRead);
f(ll != NULL)
head = add(head, ll);
else
break;
}
对不起,我十亿年前就用C编程了,所以叫我一个菜鸟!
答案 0 :(得分:2)
在add()
函数中,您只需分配char *
,而不是为每个字符串分配任何新内存(然后复制)。所以每个TOKEN
最终指向原始缓冲区。当你在顶级使用单个缓冲区时,你会一遍又一遍地覆盖它。
简而言之:每行需要一个单独的缓冲区。一种方式(不一定是最好的方式)是在add()
:
int len = strlen(value);
...
tmp->value = malloc(len+1); /* +1 for null terminator */
strncpy(tmp->value, value, len+1);
请记住,在某些时候,您需要free()
所有这些额外的缓冲区。