2016-04-22 8 views
0

Die Werte von jedem Knoten in meiner verknüpften Liste sind jetzt alle gleich 'temp', obwohl ich möchte, dass sie getrennt bleiben. Wenn "temp" in der letzten Iteration der while (1) Schleife "STOP" zugewiesen wurde, werden alle anderen Werte als "STOP" ausgegeben.Wie man den Wert char [] einer Struktur dem Wert einer Datei zuweist, ohne dass es ein Zeiger ist?

//******************* 
//* GEORGE TANGEN * 
//*  HW 9  * 
//******************* 

#include <stdio.h> 
#include <stdlib.h> 
#include <string.h> 

struct node{ 
    struct node *next; 
    struct building *payload; 
}; 

struct building{ 
    char *name; 
    struct arc *list[]; 
}; 

struct arc{ 
    int weight; 
    struct building *start; 
    struct building *end; 
}; 

int main(){ 

    struct node *head; 
    struct node *trace; 
    head = malloc(sizeof(struct node)); 
    head->payload = malloc(sizeof(struct building)); 
    head->payload->name = "Head"; 

    int k; 
    trace = head; 
    for(k=0;k<10;k++){ 
     trace->next = malloc(sizeof(struct node)); 
     trace = trace->next; 
     trace->payload = malloc(sizeof(struct building)); 
     trace->payload->name = "hi"; 
    } 

    FILE *f1; 
    int i,j; 
    char *op = {"hw9.data"}; 
    f1 = fopen(op,"r"); 
    if(f1==NULL){ 
     printf("No File!"); 
     return 0; 
    } 
     trace = head; 
     char temp[200]; 
     while(1){ 
     fscanf(f1, "%s", temp); 
     if((strcmp(temp, "STOP"))==0){ 
      break; 
     }else{ 
      printf("INPUT: %s\n", temp); 
      trace->payload->name = temp; 
      printf("OUTPUT: %s\n", trace->payload->name); 
      printf("HEAD: %s\n", head->payload->name); 
      trace = trace->next; 
     } 
     printf("%s\n\n", temp); 

     } 

     trace = head; 
     for(k = 0; k<10;k++){ 
     printf("OUTPUT: %s\n", trace->payload->name); 
     trace = trace->next; 
     } 


    fclose(f1); 

    return 0; 
} 

Antwort

2

Der Inhalt des Arrays temp jedes Mal, wenn fscanf auf nennen außer Kraft gesetzt wird, gibt es zwei Möglichkeiten, um dies.

Zunächst definieren Nutzlast eine Reihe von Zeichen zu halten, nicht nur ein Zeiger

struct node{ 
    struct node *next; 
    struct building *payload; 
}; 

struct building{ 
    char name[256]; 
    struct arc *list[]; 
}; 

// trace->payload->name = temp; do not assign here, copy the string 
strcpy(trace->payload->name, temp); 

Zweitens lassen die Struktur unverändert, stattdessen eine neue Kopie der Temp machen:

// trace->payload->name = temp; do not assign here, copy the string 
trace->payload->name = strdup(temp); 
+0

Ah , Danke! Das hat funktioniert! –

Verwandte Themen