2016-10-04 7 views
0

Ich versuche, Zeichenfolgen aus einem Feld in einer Struktur in eine andere Struktur (einen Knoten) zu kopieren, so dass ich schließlich eine Hashtabelle erstellen kann. Ich habe jedoch Probleme beim Kopieren der eigentlichen Zeichenfolge. Ich habe eine for-Schleife erstellt, um über die Strings im Source-Stuct zu iterieren, und ich weiß, dass die Iteration gut funktioniert, denn wenn ich die Source-Strings (data [i] .c_name) drucke, werden sie gut ausgedruckt. Unglücklicherweise scheint es, wenn ich versuche, das Ziel (class_id) zu drucken, leer zu sein (und daher tut meine Hash-Funktion natürlich nicht viel). Irgendwelche Einblicke in das mögliche Problem würden hier sehr geschätzt werden. Bitte lassen Sie mich wissen, wenn ich nicht genügend Kontext gegeben habe.C - Probleme beim Kopieren der Zeichenfolge von einer Struktur in einen Knoten

#define LENGTH 30 
#define MAX_OBS 80000 

typedef struct 
{ 
    char c_name[LENGTH]; 
    char s_name[LENGTH]; 
    double value[MAX_OBS]; 
} 
sample; 

typedef struct node 
{ 
    char class_id[LENGTH]; 
    struct node *next; 
} 
node; 

{ 
    char class_id[LENGTH]; 

    for (int i = 0; i < total_columns; i++) 
    { 
     // malloc a new node pointer for each new class label 
     node *new_node = malloc(sizeof(node)); 

     // check that there was sufficient memory 
     if (new_node == NULL) 
     { 
      return 6; 
     } 

     // copy c_name into node -- failing - class_id is empty 
     strcpy(new_node->class_id, data[i].c_name); 
     printf("%s\n", class_id); 
    } 
} 

Antwort

1

Tropfen der letzte char class_id[LENGTH];, die Sie drucken, wie es nie initialisiert wurde. Wechseln Sie dann printf(), um das tatsächliche Ziel von strcpy zu verwenden.

 strncpy(new_node->class_id, data[i].c_name, LENGTH); 
printf("%.*s\n", LENGTH, new_node->class_id);

Ich habe setzen auch einige LÄNGE Grenzen in meinem Code, den Sie nicht tun schlechte Dinge auf schlechten Eingang ohne Terminal \ 0 zu gewährleisten. Vertrauen Sie niemals blind Ihrem C-Input, es sei denn, Sie haben ihn ausfallsicher erstellt.

Haftungsausschluss: Änderung der Desktop-Inspektion. Das tatsächliche Debugging wird dem Schüler als Übung überlassen.

+0

Ah fantastisch! Danke Gilbert! Ich bin ein bisschen verwirrt, obwohl - der new_node nur auf die class_id zeigt, warum also nicht die class_id drucken würde? Außerdem - ich kann definitiv die Wichtigkeit schätzen, dafür zu sorgen, dass nur die LÄNGE erlaubt wird kopiert wird, aber da beide Felder durch die gleiche Länge definiert sind, warum sollte es nicht sicher sein, das wegzulassen? Danke nochmal für deine Hilfe! –

+0

@AllieH Die lokale Variable new_node verweist nicht auf die lokale Variable class_id. Die lokale Variable namens new_node verweist auf einen Knoten, der ein Member namens class_id hat, das nicht mit der lokalen Variablen namens class_id in Beziehung steht. – immibis

Verwandte Themen