Aus Konsole einlesen
-
#include <stdio.h> #include <string.h> int main() { char text[128]; while (!feof(stdin) && puts("Bitte Textzeile eingeben:")) if (fgets(text, sizeof(text), stdin)) { unsigned len = strlen(text); printf("Eingegebener Text(mit Zeilenumbruch): %s" , text); if (text[len-1] == '\n') text[len-1] = 0; printf("Eingegebener Text(ohne Zeilenumbruch): %s\n" , text); } }
Dieses Programm verwirft keine halben Zeilen sondern liest bei Zeilen über 128 Zeichen den Rest der Zeile als nächste Zeile. Kann man natürlich auch anders machen, aber ich nahm mal ganz stark an, dass du hier keine Benutzereingaben verwerfen möchtest.
-
wenn ich dein programm so kompiliere, lässt er mich aber nichts eingeben sondern terminiert gleich...?
-
Das kann ich nicht nachvollziehen. Dann wäre stdin und/oder stdout bei dir gar nicht verfügbar.
-
... oder puts() liefert 0 zurück.
-
DirkB schrieb:
... oder puts() liefert 0 zurück.
Ach Mist! Klar, das wird es sein. "Non-negative" schließt ja eine Null nicht aus. Ich mache einfach zu viel C++.
Also entweder:
while (!feof(stdin) && puts("Bitte Textzeile eingeben:") > 0)
oder einfach ohne solche Hacks:
while (!feof(stdin)) { puts("Bitte Textzeile eingeben:"); if (fgets(text, sizeof(text), stdin)) { unsigned len = strlen(text); printf("Eingegebener Text(mit Zeilenumbruch): %s" , text); if (text[len-1] == '\n') text[len-1] = 0; printf("Eingegebener Text(ohne Zeilenumbruch): %s\n" , text); } }
-
SeppJ schrieb:
Ach Mist! Klar, das wird es sein. "Non-negative" schließt ja eine Null nicht aus. Ich mache einfach zu viel C++.
Also entweder:
while (!feof(stdin) && puts("Bitte Textzeile eingeben:") > 0)
Wäre da ein >= nicht angebrachter?
Doch lieber ohne Hack
-
ich hab jetzt mal ein Minimalbeispiel erstellt, um grundlegend zu zeigen, wie ich es momentan implementiert habe:
#include <stdio.h> #include <string.h> int main() { char data[128]; int c; while (1) { printf("Eingabe: "); scanf("%127[^\n]", data); while ((c = getchar()) != EOF && c != '\n'); printf ("Gesendet: %s\n", data); } }
Das Ganze funktioniert soweit, allerdings nimmt er immer den zuletzt eingegebenen Inhalt und sendet diesen. Soll heißen, wenn ich z.B. "xy" eingebe und beim nächsten Durchlauf nur Enter drücke, sendet er trotzdem "xy". Ohne dem [^\n] allerdings kann ich keine Leerzeichen einlesen...
-
Nun, scanf ändert nichts an der Variablen, wenn nichts eingelesen wurde.
Du kannst den Rückgabewert von scanf auswerten.
Darin steht, wieviel Parameter scanf erfolgreich lesen konnte. siehe: http://www.cplusplus.com/reference/clibrary/cstdio/scanf/if (1 == scanf("%127[^\n]", data)) printf ("Gesendet: %s\n", data); while ((c = getchar()) != EOF && c != '\n');
oder so ähnlich.
-
danke, die Lösung gefällt mir gut!
-
SeppJ schrieb:
while (!feof(stdin)) { ; if (fgets(text, sizeof(text), stdin)) }
Das feof ist hier redundant, fgets selbst prüft dies schon und es prüft noch mehr, nämlich auch evtl. Einlesefehler.
Also wennschon, dannwhile( puts("Bitte Textzeile eingeben:"), fgets(text, sizeof(text), stdin) ) { ... }