我遇到这个问题的麻烦我找不到这个bug 我将字符串从文件存储到链表。 假设该文件包含5个字符串
插孔
娟
史蒂芬
麦克
SAM
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
struct Node {
char * data;
struct Node *next;
};
struct Node *head;
void print() {
while (head != NULL) {
printf(" [%s] ", head->data);
head = head->next;
}
printf("\n");
}
void insertb(char *data) {
struct Node *temp;
temp = (struct Node*)malloc(sizeof(struct Node));
temp->next = NULL;
temp->data = data;
if (head == NULL) {
head = temp;
printf("%s\n", head->data);
} else {
temp->next = head;
head = temp;
printf("%s %s\n", temp->data, temp->next->data);
}
}
int main (int argc, char *argv[]) {
FILE *file = fopen(argv[1], "r");
head = NULL;
char data[10];
//int data;
while (fscanf(file, "%s",&data) != EOF) {
insertb(data);
// printf("%s\n", data);
}
print();
fclose(file);
return 0;
}
答案 0 :(得分:1)
您只有一个缓冲区来存储字符串data
。每次调用fscanf都会覆盖它的内容。
尝试insertb(strdup(data));
。
答案 1 :(得分:0)
您正在将头设置为temp,这是每次向列表中添加一些内容时的最后一个。在insertb函数中,else块可能是您要查找的位置。另外,制作全局变量被认为是一个非常糟糕的主意,因此它很可能无意中改变全局变量的内容,这可能会使事情变得棘手。我建议你在C中寻找通过引用的东西。我看到另一个答案告诉你使用strdup,也许我也错了,我不想与之争论,但strdup重复了字符串。而不是我用
“重新初始化”char数组memset(buffer, 0, bufferLength);
并在字符串末尾手动添加“\ 0”字符以防止在缓冲区中保存垃圾。希望这会有所帮助。