Eingabeumleitung und fgets
-
Guten Abend!
Ich habe innerhalb meines Programmes ein kleines Problem mit der Benutzereingabe via Eingabeumleitung und fgets. Starte ich das Programm ganz normal via Terminal und lasse den Benutzer die Eingaben manuell tätigen, funktioniert alles prächtig.
Lasse ich das Programm jedoch in der Form "./programmname <Eingabe.txt" laufen (in der Datei 'Eingabe.txt' steht in einer Zeile jeweils ein Befehl, auf die das Programm reagieren kann), entsteht nur eine Dauerschleife...Achja: Compiler ist "cc" unter Linux.
Hier mal der relevante Teil des Programms. Gibt man als Benutzer "q" ein, beendet das Programm auch korrekt. Wird die Eingabe aber aus einer Textdatei umgeleitet, kommt es zu der Schleife.
#include <stdio.h> #include <string.h> int main () { int quit = 0; while (quit == 0) { char value[30]; fgets(value, 29, stdin); printf("Gelesen wurde: %s\n", value); value[(strlen(value)-1)] = '\0'; if ( strcmp(value, "q") == 0 ) { printf("\nEnde!!\n"); quit = 1; } } return 0; }
Wäre super, wenn jemand eine Lösung hat.
Vielen Dank im Voraus!
-
Irgendeine *get* Funktion hängt Zeilenumbrüche an.
Ich glaub, das war fgets().In dem Fall würde reichen:
strcmp(value, "q[b]\n[/b]") == 0
-
Hey,
ich danke Dir vielmals! Nun klappt es einwandfrei vom Terminal und über Eingabeumleitung.
Glaubst gar nicht, wie lange ich an diesem blöden Fehler schon gegrübelt habe... *g*
Nur der Vollständigkeit halber, so läuft es:
#include <stdio.h> #include <string.h> int main () { int quit = 0; while (quit == 0) { char value[30]; fgets(value, 28, stdin); printf("Gelesen wurde: %s\n", value); if (strcmp(value, "q\n") == 0) { printf("\nEnde!!\n"); quit = 1; } } return 0; }
Wünsche noch einen schönen Abend!
-
Warum:
char value[30]; fgets(value, 29, stdin);
und dann:
char value[30]; fgets(value, 28, stdin);
Wenn doch richtig wäre:
char value[30]; fgets(value, 30, stdin);
?
man man: fgetsUnd dann am besten noch mit symbolischen Konstanten arbeiten, anstatt immer die 30 zu tippen.
Ansonsten ist die Methode von dir, also auf einen String mit den angehängten '\n' zu vergleichen, nicht unbedingt toll. Besser wäre es vielleicht dieses '\n' aus dem eingelesenen String zu entfernen. z.B. so:
char value[BUFFER_LENGTH]; fgets(value, BUFFER_LENGTH, stdin); char *tmp = strchr (value, '\n'); if (tmp) { *tmp = '\0'; }
-
Hi,
hast natürlich mit allem vollkommen Recht! Ich hatte nämlich am Anfang einen generellen Denkfehler, was fgets betrifft. n-1 von n Zeichen werden eingelesen und das letzte der n Zeichen eben mit '\0' terminiert, so passt's auch.
Hab's in meinem richtigen Programm auch mit Konstanten (und nicht mit unterschiedlichen Werten, mea culpa!
) gemacht, das hier gepostete Beispiel mit den festen 30 Zeichen war quasi nur ein "Experimentiercode", um zu zeigen, was das Problem ist. In meiner Freude natürlich völlig vergessen, das hier zu korrigieren.
Eine fast identische stringNormalize()-Funktion, um das '\n' zu entfernen, hatte ich mir eine halbe Stunde später auch geschrieben - nur drauf gekommen, dass es daran lag, wäre ich ohne Eure Hilfe erstmal gewiss nicht, schätze ich.
Ein dickes Lob an Euch fleißige Helfer!