这是我的密码。我陷入了流文件添加字符串到我的链接列表。例如,这里有一个名为foo的文件。在foo中,它的格式如下
12345678 12345678
1233 1389732
等等。这意味着我得到文件的每一行,只读取第一个字符串并将其添加到列表中。我在95号线上勾选了“a/b/c/d”。它起作用了。所以insert函数正在工作。问题出现在101号线上。我不知道为什么第二行的值覆盖了第一行的值。
也就是说,当我一步一步地打印列表时
a/b/c/d/12345678/
a/b/c/d/1233/1233/
我不明白为什么nit要打印a/b/c/d/12345678/1233作为第二行?
有什么建议吗?
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
typedef struct n{
char *value;
struct n *next;
} Node;
void printList(Node *head){
Node *cur = head;
while(cur!=NULL){
printf("%s/", cur->value);
cur = cur->next;
}
printf("\n");
}
void insertIntoList(Node **head, char *data){
Node *newNode = malloc(sizeof(Node));
if (newNode == NULL){
perror("Failed to allocate a new node for the linked list");
exit(1);
}
newNode->value = data;
newNode->next = NULL;
Node *currentList = *head;
if(*head == NULL){ //if the linked list head is null, then add the target into linked list
*head = newNode;
}
else{
while(currentList->next!=NULL){
currentList = currentList->next;
}
currentList->next = newNode;
}
}
int main(int argc, char**argv){
FILE *fileStream;
size_t len = 0;
char *line = NULL;
Node *head = NULL;
int j;
for(j=1; j<argc-2;j++){
fileStream = fopen(argv[j], "r");
if(fileStream == NULL){
fprintf(stderr, "could not open");
continue;
}
insertIntoList(&head,"a"); /////////////Line 95
insertIntoList(&head,"b");
insertIntoList(&head,"c");
insertIntoList(&head,"d");
printf("here is a try\n");
printList(head);
while(getline(&line, &len, fileStream)!=EOF){ /////////////Line 101
char *targetNum = strtok(line, " ");
if(strcmp(targetNum, "\n")!=0&&strcmp(targetNum,"\t")!=0&&strcmp(targetNum," ")!=0){
printf("*****%s\n", targetNum);
insertIntoList(&head, targetNum);
printf("######print head here is##########\n");
printList(head);
printf("######print head here is##########->\n");
}
}
//printList(head);
}
return 0;
}
最佳答案
原因是,您只是在列表中存储指针,而不是实际的数据。
前4项都有不同的内存位置,因此它们保持不同。
但是接下来的两个内存位置相同,所以这两个数据都是相同的,这是放置在该位置的最新数据。