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");
}
}
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. –
Ü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. –
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