strong text我创建了两个结构体,供体和读取。
struct stored
{
char *string;
struct stored*link;
};
struct donor
{
char *id;
struct donor* link;
};
1 FM SA 1 1.0
2 FM SG 2 4.0
3 OM AU 1 0.5
这里的目标是读取testing.txt的包含捐赠详细信息行的行(如上所示(,将每一行字符串保存在链表中(存储(,然后循环(存储(在每个节点再次获得字符串,将字符串拆分为空格分隔的值,创建一个结构Donor,然后将第一个索引值存储到Donor*节点中->id。当完成循环(存储(时,我们将创建另一个具有所有id(1-5(的链表(Donor(。这里的问题是,我的head1指针地址与循环一起循环,并且我丢失了地址。这是代码:
typedef struct stored Stored;
typedef struct donor Donor;
Stored *head, *current ;
Donor *head1, *current1 ;
void print(Stored* head){
Stored* current_node = head;
while(current_node!= NULL){
printf("%sn", current_node->id);
current_node = current_node->link;
}
}
int main(void){
char line[128];
FILE * fp;
head = current = NULL;
fp = fopen("testing.txt","r");
while(fgets(line, sizeof(line), fp)){
Stored *node = malloc(sizeof(Stored));
node->string = strdup(line);
node->link = NULL;
if(head == NULL){
current = head = node;
}
else{
current = current->link = node;
}
}
print(head);
Stored*temp = head;
char *stemp;
char newString[10][10];
int j, i, ctr;
head1 = current1 = NULL;
while(temp != NULL){
stemp = temp->string ;
j=0; ctr=0;
for(i=0;i<=(strlen(stemp));i++){
// if space or NULL found, assign NULL into newString[ctr]
if(stemp[i]==' '||stemp[i]==' '){
newString[ctr][j]=' ';
ctr++; //for next word
j=0; //for next word, init index to 0
}
else{
newString[ctr][j]=stemp[i];
j++;
}
}
Donor *node = malloc(sizeof(Donor));
node-> id = newString[0];
node->link = NULL;
if(head1 == NULL){
current1 = head1 = node;
}
else{
current1 = current1->link = node;
}
temp = temp->link;
}
print(head1);
}
当使用print((时,它循环通过给定的头地址并返回字符串或id,它输出
1 FM SA 1 1.0
2 FM SG 2 4.0
3 OM AU 1 0.5
4 SM DE 3 6.0
5 HS US 2 7.5
5
5
5
5
5
我怀疑,在else期间,head1也会将自己更新为current1地址。当调用打印(head1(时,其id从5开始。我在这里做错了什么?
if(head1 == NULL){
current1 = head1 = node;
}
else{
current1 = current1->link = node;
}
这里的教训是在复制指针时要非常小心,不要认为复制/存储字符串是一样的。
node-> id = newString[0];
正如有人指出的,它与node->id=&newString[0][0]
node-> id = strdup(newString[0]);
这修复了一切。