Texteingabe mit Leertaste beenden (Klausuraufgabe)
-
Erstmal Hallo,
bin neu hier im Forum, studiere Mechatronik und bin wohl leider restlosunbegabt im Fach "Angewante Informatik".
In ca 4 Wochen schreiben wir Prüfungen und wir bekamen gestern eine Probeklausur. Mein Kenntnisstand: Grauenhaft. Bei vorerst einer Aufgabe benötige ich eure Hilfe.
In einem C-Programm sollen bis zur Eingabe der Leertaste beliebig oft Zeichen von der Tastatur eingelesen werden. Nach zeicheneingabe soll die Anzahl der eingegebenen Zeichen, Groß- und Kleinbuchstaben sowie Ziffern ausgegeben werden.
Zum Zweiten meiner Meinung nach unproblematischeren Teil der Aufgabe bin ich nicht gekommen, da ich bereits an der Abbruchbedingung der Leertaste scheitere.
Hier mein nicht funktionierendes Programm, ich weiß nicht wies hier üblich ist, nur einen Auszug einzustellen oder vorerst das ganze Programm:
#include <stdio.h> #include <stdlib.h> int main(int argc, char *argv[]) { char satz[100]; int anz,anzgro,anzzif,anzkle; int i=0; printf("Bitte geben sie eine Zeichenkette ein, zum Beenden Leertaste:\n"); for(i=0; satz[i]==32 ; i++) { scanf("%c", satz[i]); } printf("%s", satz); system("PAUSE"); return 0; }
da kommt nur Käse raus, ich komm überhaupt nicht zu ner Eingabe.
Weitere eingegebene Schleifen:
while (1){ scanf("%c", satz[i]); if (satz[i]=32) break; i++; }
do{ scanf ("%c",satz[i]); i++;} while (satz[i-1]!=32);
könnte ich eigenltihc auch mit gets(text) arbeiten?
ich hoffe ihr könnt mir helfen.
LG Manuel
-
Hier mal ein Code mit Kommentaren, warum das so funktioniert:
#include <stdio.h> int main(void) { char buffer[1024]; printf("Bitte geben sie eine Zeichenkette ein, zum Beenden Leertaste:\n"); scanf("%1023s", buffer); /* %s liest bis zum ersten Whitespace ein... dazu gehören auch Leertasten die 1023 verhindert, dass über das Ende des Puffers geschrieben wird. */ /* Jetzt liegt in buffer dein Text bis zum Leerzeichen. Über den Rest kannst du dir erstmal selbst Gedanken machen ;-) */ return 0; }
-
scanf() ist dafür nicht geeignet.
gets() liest einen String (bis zum Newline) ein.Du brauchst: http://www.cplusplus.com/reference/clibrary/cstdio/getchar/
Da gibt es sogar fast das Beispiel das du brauchst.
-
@DrakoXP
1023 ist aber nicht beliebig oft.
-
Für einen Anfänger schon mal ganz gut, immerhin hast du schon mal das C/C++ Tag verwendet, viele andere Anfänger finden das einfach nicht, weil sie nicht nachdenken, wenn sie ihre Frage abschicken.
int main(int argc, char *argv[]) { char satz[100]=""; /* füllt den String initial mit lauter '\0' Zeichen, d.h. mit lauter String-Ende-Kennzeichen */ int anz,anzgro,anzzif,anzkle; int i=0; printf("Bitte geben sie eine Zeichenkette ein, zum Beenden Leertaste:\n"); for(i=0; i<99 ; i++) { /* max. bis VOR das letzte mögliche Zeichen lesen, d.h. hier Überlaufschutz für satz */ satz[i]=getchar(); /* liest ein Zeichen von der Standardeingabe (stdin) ein */ if( satz[i]==' ' ) break; /* Abbruch der For-Schleife, wenn Leerzeichen vorkommt */ } printf("%s", satz); system("PAUSE"); return 0; }
Bis auf "system("PAUSE")" ist das jetzt ein strikt konformes ANSI C Programm, läuft also überall, wo es einen ANSI C Compiler gibt gleich ab.
Zu beachten ist jedoch, dass die Standardeingabe gepuffert wird und erst durch '\n' (normalerweise ENTER-Taste) der weitere Programmlauf erfolgt.
Die oftmals in diversen "Tutorials" verwendete Funktion getch() (statt getchar()) blockiert nicht, ist aber nicht standardkonform, d.h. je nach Compiler gibt es sie und läuft vielleicht auch gleich ab oder nicht.
-
DirkB schrieb:
@DrakoXP
1023 ist aber nicht beliebig oft.Kannst du das mal genauer erklären? Der Satz ergibt so für mich gerade keinen Sinn...
EDIT:
okay, denke jetzt hab ichs...
aber wenn es darum geht, ist keiner der Pufferansätze korrekt, weder der vom TS noch der von Wutz.
In dem Fall kann man wirklich nur die Zeichen einzeln einlesen und direkt mitzählen, wie viele groß, klein und numerisch waren.Zur Eingabe ohne auf Enter zu warten:
Unter Windows könntest du getch() verwenden (conio.h... Compiler-abhängig,
insofern unportabel, aber eben sehr praktisch ;p).
Für Linux gibt es eine Möglichkeit die getch-Funtkion nachzubauen,
siehe hier: http://www.c-plusplus.net/forum/39509
-
So lautet die Aufgabe:
glückspirat schrieb:
In einem C-Programm sollen bis zur Eingabe der Leertaste beliebig oft Zeichen von der Tastatur eingelesen werden. Nach zeicheneingabe soll die Anzahl der eingegebenen Zeichen, Groß- und Kleinbuchstaben sowie Ziffern ausgegeben werden.
Deine Eingabe ist auf 1023 Zeichen begrenzt.
-
Danke an euch für die schnellen Antworten.
@DrakoXP:
Tut mir leid wenn ich das jetzt etwas Plump sagen muss... ich verstehs nicht und iwie funktionierts auch nicht... der Rest kommt späterDirkB schrieb:
Du brauchst: http://www.cplusplus.com/reference/clibrary/cstdio/getchar/
Da gibt es sogar fast das Beispiel das du brauchst.Ok was ich schon mal verstanden habe: die AUfgabe ist mit getchar/getch zu lösen. Bin ich auf jedenfall schon mal weiter. schöne seite
@Wutz:
Find ich gut, versteh ich, klingt logisch. Ich hab jetzt mal das Programm einfach kopiert und ausgeführt, funktioniert nicht. Der geht nicht in die break! Wenn ich aus getchar, getch gehts nur da kann ich mich nicht schreiben sehen. Das mit dem gehtchar und getch habe ich leider nicht so wirklich verstanden...LG Manu
-
Das Beispiel funktioniert, irgendwas machst du falsch.
-
Das Programm funktioniert in sofern, dass bist zur Eingabe der Leertaste alle Zeichen gespeichert werden und abgerufen. Mein Problem ist, dass die EIngabemöglichkeit definitiv nicht mit eingabe der Leertaste endet und mit dem Programmablauf fortfährt sondern trotzdem auf die Enter Taste wartet. Erst nach Eingabe dieser gehts ohne Probleme weiter, es soll doch aber direkt nach der Leertasten eingabe weiter gehen.
So viel kann ich mit Kopieren und Einfügen doch nicht falsch machen
-
glückspirat schrieb:
So viel kann ich mit Kopieren und Einfügen doch nicht falsch machen
Du hast auch nichts falsch gemacht. Dieses Verhalten liegt am System und nicht an deinem Programm. Dein Programm kann nur aus stdin lesen, aber z.B. Windows schreibt die Daten erst nach stdin nach dem du Enter gedrückt hast. Vorher sind diese Daten für dich unsichtbar und du hast keinen Einfluss darauf.
Wenn du das Verhalten doch haben möchtest, musst du Systemfunktionen nutzen, z.B. getch(). (getche() geht auch, produziert sogar ein Echo auf der Konsole.)
-
Nochmal zu mitschreiben:
Es gibt keine standardkonforme Möglichkeit, auf stdin ohne Blockierung zu arbeiten, es wird immer auf das erste Vorkommen von '\n' bzw. im Ausnahmefall auf EOF gewartet, bevor das Programm weiterlaufen kann (und die gepufferten Zeichen abräumen kann).
Alle auf stdin arbeitenden Standardfunktionen (scanf,getchar,...) arbeiten so.
-
DrakoXP schrieb:
scanf("%1023s", buffer); }
Ist falsch im Sinne der genannten Aufgabenstellung, da %s bekanntlich bei jedem Whitespace abbricht, also z.B. auch bei '\t' und nicht nur bei ' '.
-
@Wutz: hatten wir die Lösung nicht ohnehin schon ausgeschlossen?
aber zum Problem, dass du bei getch() nichts siehst:
nimm getche(), das gibt das eingegebene Zeichen nochmal aus ("echo")
-
Perfekt jetzt funktionierts, vielen dank an euch!