Das Programm zielt darauf ab, das erste Wort und eine Reihe von verbleibenden Wörtern zu erhalten. Wenn beispielsweise line = "a bb cc dd ee"
, dann key
a
sein sollte, sollte keySet
ein Zeiger auf ein Array von {bb,cc,dd,ee}
sein.Zuweisungsspeicher zu Char **
Ich versuche, Speicher dynamisch char** keySet
zuzuweisen, aber KeySet-Ausgabe immer ee ee ee ee
. Es scheint, dass keySet nicht der Zeiger auf das erste Element des Arrays ist, sondern auf das letzte Element zeigt. Was ist das Problem in meiner Funktion?
void allocateKeySet(char* line){
int count = 0;
char* token = strtok(line, " ");
char key[17];
char tempKey[17];
char** keySet;
sscanf(strtok(NULL, " "), " %s", key);
keySet = calloc(1, sizeof(char*));
while((token = strtok(NULL, " ")) != NULL){
sscanf(token, " %s", tempKey);
keySet[count++] = tempKey;
keySet = realloc(keySet, (count+2) * sizeof(char*));
}
printf("key: %s\n", key);
printf("keySet: ");
for(int i = 0; i < count - 1; i++){
printf("%s ", keySet[i]);
}
}
z.B. Linie:
"a bb cc dd ee"
erwartete Ausgabe:
key: a
keySet: bb cc dd ee
Meine Ausgabe:
key: a
keySet: ee ee ee ee
'keySet [count ++] = tempKey;': Wahrscheinlich möchten Sie 'str (n) cpy' oder' strdup'. Momentan wird 'tempKey' immer neu zugewiesen und alle' keySet' Elemente zeigen auf * den gleichen * 'tempKey'. Nach der letzten 'tempKey'-Zuweisung zeigen sie alle auf' 'ee''. (Beachten Sie, dass Sie, wenn Sie 'strcpy' verwenden, zuerst Speicher für' keySet [count ++] 'zuweisen müssen;' strdup' übernimmt die Zuweisung und Zuweisung auf einmal, aber Sie müssen trotzdem auf 'NULL' testen danach.) – Evert
meinst du: 'strdup (keySet [count ++], tempKey)'? –
Fast: 'keySet [count ++] = strdup (tempKey)'. Teste nachher 'keySet [count-1]! = NULL' danach (unwahrscheinlich, aber die richtige Sache). – Evert