2016-12-11 2 views
0

Ich versuche Zeile von Stdin zu lesen und es in einem Zeigerarray zu speichern, wenn ich das Array drucke, bekomme ich den letzten eingegebenen Wert, die anderen Werte werden durch den zuletzt eingegebenen ersetzt Wert. Die if-Anweisung funktioniert erst beim ersten Mal, danach kommt der Vergleich nicht true. Wie kann ich eine Zeile in ein Zeigerfeld einlesen?Zeile von stdin zu Zeigerarray lesen in C

void read_line(int fd, char *s) 
{ 
    char line[100]; 
    char *list[100]; 
    int i = 0; 

    while ((read(1, line, 100))) 
    { 
     if (!strncmp(line, s, strlen(line) - 1)) 
      break; 
     else 
      list[i++] = line; 
    } 
    i = 0; 
    while (list[i]) 
    { 
     write(fd, list[i], strlen(list[i])); 
     i++; 
    } 
} 

ich rufe die Funktion

read_line(1, "exit"); 
//if I type more words before typing exit, then type exit program doesn't terminate 
+0

Sie speichern die gleichen Zeiger auf 'line' für jeden Eintrag. Nächster Eintrag, alle vorherigen zeigen auf dieselbe Zeichenfolge. Ziehen Sie 'strdup' in Betracht. –

+1

Sie sollten 'list' mit' char * list [100] = {0}; ' –

+1

' char line [100]; char * Liste [100]; '->' Zeichenkette [100] = ""; char * Liste [100] = {NULL}; ',' sonst Liste [i ++] = Zeile; '->' Liste [i ++] = strdup (Linie); memset (line, 0, sizeof line); ', – BLUEPIXY

Antwort

0

Zuerst sollten Sie sicherstellen, dass read nicht durch Überprüfung der Rückgabewert nicht hat:

while ((read(1, line, 100)) > 0) 

Dann müssen Sie line Inhalt in list[i++] mit strdup kopieren , andernfalls werden alle Listenelemente mit dem letzten Wert angezeigt, auf den line zeigt.

Schließlich, was erwarten Sie, wenn read die Grenze Ihres Puffers erreicht? Vielleicht möchten Sie auch damit umgehen.

-Code könnte wie folgt aussehen:

#define SIZE 100 
void read_line(int fd, char *s) 
{ 
    char line[SIZE]; 
    char *list[SIZE] = { 0 }; 
    int i = 0; 
    ssize_t retval; 
    while ((retval = read(1, line, SIZE)) > 0) 
    { 
     if (retval == SIZE) 
      // adapt to the desired behavior here... for now we'll abort 
      break; 
     else if (!strncmp(line, s, strlen(line) - 1)) 
      break; 
     else 
      list[i++] = strdup(line); 
     memset(line, 0, SIZE); 
    } 
    i = 0; 
    while (list[i]) 
    { 
     write(fd, list[i], strlen(list[i])); 
     i++; 
    } 
}