2015-01-11 5 views
6

Also mit C wieder vertraut erhalte ich, und dieses Konzept hat mich besonders fest.Wie String Array von Strings in C hinzufügen

Das Ziel ist eine dynamisch zugewiesene Array von Strings zu erstellen. Ich habe dies getan, indem ich zuerst ein NULL-Array erstellt habe und für jede eingegebene Zeichenfolge den entsprechenden Speicherplatz zugewiesen habe. Das einzige Problem ist, wenn ich versuche, tatsächlich eine Zeichenfolge hinzuzufügen, bekomme ich einen Seg Fehler! Ich kann nicht herausfinden, warum, ich habe eine Ahnung, dass es von einer unpassenden Zuteilung ist, weil ich nichts falsches mit meiner strcpy Funktion sehen kann.

Ich habe eine Antwort erschöpfend auf dieser Seite sehe, und ich habe Hilfe gefunden, aber das Geschäft nicht ganz schließen kann. Jede mögliche Hilfe, die Sie zur Verfügung stellen können, würde sehr geschätzt werden!

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

int main() 
{ 
    int count = 0; //array index counter 
    char *word; //current word 
    char **array = NULL; 


    char *term = "q"; //termination character 
    char *prnt = "print"; 

    while (strcmp(term, word) != 0) 
{ 
    printf("Enter a string. Enter q to end. Enter print to print array\n"); 
    // fgets(word, sizeof(word), stdin); adds a newline character to the word. wont work in this case 
    scanf("%s", word); 

    //printf("word: %s\nterm: %s\n",word, term); 

    if (strcmp(term, word) == 0) 
    { 
    printf("Terminate\n"); 
    } 

    else if (strcmp(prnt, word) == 0) 
    { 
    printf("Enumerate\n"); 

    int i; 

    for (i=0; i<count; i++) 
    { 
     printf("Slot %d: %s\n",i, array[i]); 
    } 

    } 
    else 
    { 
    printf("String added to array\n"); 
    count++; 
    array = (char**)realloc(array, (count+1)*sizeof(*array)); 
    array[count-1] = (char*)malloc(sizeof(word)); 
    strcpy(array[count-1], word); 
    } 

} 

    return ; 

} 

Antwort

6

word hat keinen zugewiesenen Speicher. Ihr Programm in seiner aktuellen Form trampelt über nicht zugewiesenen Speicher, wenn Benutzer Wörter in Ihr Programm eingeben.

sollten Sie guesstimate, wie groß Ihre Eingabe den Eingangspuffer wie dies wäre und zuteilen:

char word[80]; // for 80 char max input per entry 
+0

Ah !! Wie albern von mir, es scheint immer die winzigen Details zu sein, die übersehen werden. Das hat geholfen wie ein Zauber. Ich danke dir sehr! – colinmcp

+0

auch, 'fgets (Wort, sizeof (Wort), stdin);' in den Code des OP auf Kommentar, ist falsch, weil 'sizeof' Betreiber nicht die Anzahl der Zeichen von' word' zählt, sondern gibt die Größe der 'word' Variablentyp, und da Wort ein Zeiger' sizeof (Wort) 'ist, wird die Größe eines Zeigers angegeben, dh' sizeof (char *) '. Wenn das OP jedoch diese Lösung verwendet, wird in diesem Fall der Operator "sizeof" angewendet. –

+2

@colinmcp Oh, und auch verhindern, dass Pufferüberlauf zu tun 'scanf („% 79s“, ein Wort);' wobei die Zahl die Größen des Arrays minus 1, da Sie für die Null-Terminierung Byte bilanzieren sollen. –