2017-01-06 4 views
-4

Ich habe ein Problem mit einem Code in C. Ich muss eine Liste von Namen eingeben, die durch die Eingabetaste getrennt werden. Die Eingabe wird gestoppt, wenn der Benutzer das Wort "QUIT" eingibt. Das Programm muss die Liste der Namen in alphabetischer Reihenfolge drucken (alle Buchstaben sind Kleinbuchstaben).Dynamische Zuweisung eines Arrays von Zeigern

Die Anzahl der Namen sowie die Länge jedes Namens ist unbekannt und muss dynamisch zugewiesen werden. Wenn ein Name mehrmals in der Eingabe erscheint, sollte er nur einmal in der Ausgabe erscheinen.

hier ist ein Beispiel dafür, wie der Code ausgeführt werden soll:

Please enter a list of names: 

john 

chris 

ben 

chris 

david 

QUIT 

Es gibt 4 Namen:

ben 

chris 

david 

john 

Ich dachte über eine dynamische zugeordnete Array von Zeigern verwendet wird, in dem jeder Zeiger enthalten jeweils Name und ist dynamisch zugeordnet. Das Problem ist, dass ich nicht weiß, wie man es schreibt, ohne einen Laufzeitfehler zu bekommen.

Hinweis: Zu diesem Zeitpunkt darf ich Dinge, die ich noch nicht gelernt habe, wie structs und recursion, nicht verwenden und kann nur die Bibliotheken stdio.h, stdlib.h und string.h benutzen.

Vielen Dank im Voraus.

hier ist der Code (es ist nicht fertig ist, aber ich bin an diesem Punkt einen Laufzeitfehler erhalten):

char **nameList; 
int i = 0, j = 0, size = 0, check = 0; 
printf("Please enter list of names:\n"); 
//allocate one cell of memory to the list 
nameList = (char**)malloc(sizeof(char)); 
if (nameList == NULL) 
{ 
    printf("Cannot allocate Memory"); 
    return 0; 
} 
//Add the first letter to the first string in the array 
nameList[i][j] = getchar(); 
size += sizeof(char); 
while (check != 1) 
{ 
    //check if current entered letter is not an enter 
    while (nameList[i][j] != '\n') 
    { 
     //allocated another char sized memory to the string 
     nameList = (char**)realloc(nameList, (size + sizeof(char))); 
     if (nameList == NULL) 
     { 
      printf("Cannot allocate Memory"); 
      return 0; 
     } 
     j++; 
     //adding another char to the current string 
     nameList[i][j] = getchar(); 
     size += sizeof(char); 
    } 
    j = 0; 
    if (nameList[i][j] == 'Q') 
    { 
     if (nameList[i][j + 1] == 'U') 
      if (nameList[i][j + 2] == 'I') 
       if (nameList[i][j + 3] == 'T') 
        check++; 
    } 
    i++; 
} 
+1

Bitte lesen Sie [ask] und [mcve]. Sie erwähnen einen Laufzeitfehler, was ist der Code, der das verursacht? Wir können Ihnen bei bestimmten Problemen behilflich sein, die Sie zu beheben versucht haben, aber Stack Overflow ist kein Code-Schreibdienst. – whrrgarbl

+0

Ok, Sie sollten es mit dynamischer Zuweisung eines Arrays von Zeigern und Strings tun können. Sie sollten also den aktuellen Code und Ihren Fehler anzeigen. –

+0

Ich werde jede Antwort abstimmen, die diesen Schüler von seiner/ihrer Lernchance beraubt. –

Antwort

0

namelist = (char **) realloc (Namensliste, (Größe + sizeof (verkohlen)));

Uhm ... Warum benutzen Sie ein '+' dort? Und Sie suchen auch nach der Größe der falschen Art von Wert.

Dies weist ein Array von Zeigern zu. Aber worauf deuten die Zeiger hin?

+0

Ich benutze ein '+', weil ich jedes Mal, wenn ich einen Buchstaben einfüge, einen weiteren Speicher in der Größe von char zur Zeichenkette hinzufügen möchte, solange die Zeichenkette nicht 'QUIT' ist. Das Hauptproblem ist, dass ich nicht weiß, ob das der richtige Weg ist, und ob realloc sowohl für die Liste der Arrays als auch für jeden String verwendet werden soll. Jeder Zeiger soll auf jede eingegebene Zeichenkette zeigen, und jede Zeichenkette ist getrennt, wenn die Eingabe eine Eingabe ist. – Evi

+0

Die Strings müssen separat zugewiesen werden. – luckykaa

+0

Jedes Element im Array ist ein Zeiger auf eine Zeichenfolge. Also ist nameList [0] ein Zeiger auf eine Zeichenkette und diese Zeichenkette muss zugewiesen werden. Namelist [1] ist ein Zeiger auf den nächsten String und so weiter für nameList [2] zu nameList [i]. Für einen Anfänger kann es ziemlich schwierig sein, Zeiger auf Zeiger zu verfolgen, also bin ich ein bisschen besorgt, dass dieser nächste Tipp Sie verwirren kann. Aber Sie werden hier immer noch ein Problem finden. nameList ist eine Liste von "char *" (Zeiger auf char) und nicht "char", Sie müssen sizeof (char *) verwenden – luckykaa

Verwandte Themen