2016-11-15 10 views
0

Ich versuche, eine Zeichenfolge aus Benutzereingaben aufzunehmen und dann diese mit meiner verknüpften Liste zu vergleichen, die ich zuvor im Code erstellt habe, und finde die Stelle, an der die Zeichenfolge eingefügt werden soll. Und stoppen Sie die Schleife, wenn der Benutzer nichts eingibt und die Eingabetaste drückt.C Benutzereingabe und verknüpfte Liste

Ich bin in der Lage, die Zeichenfolge aufzunehmen und die Position zu finden, einzufügen, aber was ich tun möchte, ist Schleife, bis der Benutzer eine leere Eingabe eingibt. Das führt dazu, dass mein Code irgendwo bricht und ich bin mir nicht ganz sicher warum. Ich habe Breakpoints in meinen Code eingefügt, um es zu debuggen, aber ich glaube, dass ich Probleme mit fgets habe. Jede Hilfe wäre toll.

Wenn ich sage, dass die Code „Pausen“, was die Ausgabe so etwas wie dies aussieht:

BREAK1: AAAA 

BREAK2 
BREAK4 
       AAAA 
    0 
BREAK5 

Die Saite und die Position korrekt ist, aber es ist das Drucken auf mehreren Linien, und dann nach Dies führt zu einer Schleife ohne Rücksetzen. Unten ist mein Code ::

// NO FILE, SO INTAKE STRINGS 
/////////////////////////////////////////////////// 
/////////////////////////////////////////////////// 
else{ 
    fgets(buff,BUFF_SIZE,stdin); 
    buff[strlen(buff)] = '\0'; 

    while (buff[0] != '\0'){ 
     printf("BREAK1: %s\n", buff); 
     // set curr = root node 
     curr = root; 
     printf("BREAK2\n"); 
     while (curr->next){ 
      if (strcmp(buff, curr->stringDat) == 1){ 
       insertPnt++; 
       curr = curr->next; 
       printf("BREAK3\n"); 
      } 
      else{ 
       printf("BREAK4\n"); 
       insert(buff, insertPnt, root); 
       printf("%20s %d\n", buff, insertPnt); 
       break; 
      } 
     } 

     // clear buffer 
     for (i = 0; i < BUFF_SIZE; i++) { 
      buff[i] = 0; 
     } 
     printf("BREAK5\n"); 
     // user input 
     fgets(buff, BUFF_SIZE, stdin); 
     buff[strlen(buff)] = '\0'; 
     printf("BREAK6\n"); 
    } 
} 

**** AKTUALISIERT CODE (NOCH NICHT AUF BLANK ENTRY STOPPEN) ****

else{ 
     while (fgets(buff, BUFF_SIZE, stdin) != NULL){ 
      buff[strlen(buff) - 1] = '\0'; 
      insertPnt = 1; 

      printf("BREAK1: %s\n", buff); 
      // set curr = root node 
      curr = root; 
      printf("BREAK2\n"); 
      while (curr->next){ 
       if (strcmp(buff, curr->stringDat) > 0){ 
        insertPnt++; 
        curr = curr->next; 
       } 
       else{ 
        insert(buff, insertPnt, root); 
        printf("%-20s %d\n", buff, insertPnt); 
        // PRINT LINKED LIST 
        print(root); 
        break; 
       } 
      } 

      // clear buffer 
      for (i = 0; i < BUFF_SIZE; i++) { 
       buff[i] = 0; 
      } 
      printf("BREAK5\n"); 

     } 
    } 
+1

Möglicherweise zu Ihrer Frage ... Nach dem 'fgets' ruft' Buff [strlen (Buff)] 'ist bereits gleich dem String-Terminator. Wenn Sie den *** möglichen *** abschließenden Zeilenumbruch entfernen möchten, sollten Sie 'buff [strlen (buff) - 1] = '\ 0'' verwenden. –

+0

Übrigens, der korrekte Weg zu sehen, ob 'fgets' erfolgreich war oder nicht, ist zu überprüfen, ob'NULL' zurückgegeben wurde. Daher wird normalerweise eine Schleife wie 'while (fgets (...)! = NULL)' verwendet. –

+1

Was in der Dokumentation für ['strcmp()'] (http://en.cppreference.com/w/c/string/byte/strcmp) zu der Annahme führt, dass die Funktion * vorhersagbar * 1 zurückgibt ', speziell im Test von' if (strcmp (buff, curr-> stringDat) == 1) '? – WhozCraig

Antwort

2

Der String und die Position korrekt ist, aber es wird Druck auf mehrere Zeilen

Weil Sie nicht die Hinter new-line durch fgets lefted sind Strippen:

fgets(buff,BUFF_SIZE,stdin); 
buff[strlen(buff)] = '\0'; /* This is a NO-OP */ 

Wechsel zu

char *ptr; 
fgets(buff,BUFF_SIZE,stdin); 
if (ptr = strchr(buff, '\n')) { 
    *ptr = '\0'; 
}