Gets problem gelöst
-
Vor einer Woche habe ich meinen Source hier gezeigt weil ich gets probleme hatte es lage an den Daten Strom der bei scanf("%i",&wahl); gets behinderte Dies konnte man lösen indem man fflush(stdin); Darunter hengte es löscht den be inhaltenden Speicher nach dem Leerzeichen
/* Programm mit Schleife Strings Funktion usw... */ #include <stdio.h> #include <string.h> /* Lässt nullen und 1 mit Topspeed über den Bildschirm sausen ist auch nicht das wahre*/ schnelle_matrix() { int i; for(i=0;i <800; i++) { printf("0101010101010101010101010010101010101010101010101010101010110101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101 01010011010101001010110101010101010101010101010010101010110010101010101010100101\n"); } } satzfunktion () { int i, laenge, anzahl=0; double prozent; char satz [100]; printf("\nBitte einen Satz eingeben:"); gets(satz); laenge=strlen(satz); for(i=0;i < laenge; i ++) { if(satz[i] == 'e') anzahl ++; } prozent=100.0/laenge * anzahl; printf("\n%.2lf%% der Zeichen sind ein 'e'.\n\n",prozent); } satz25 () { int i=0; char satz[100]; printf("\nGeben Sie eine Satz ein:\n"); gets(satz); while (satz[i]) { switch(satz[i]) { case' ': case',': case'.': case'?': case'!': break; default: printf("%c",satz[i]); } i ++; } } main () { int i, wahl; float betrag=0; char geheim[7]; char passwort [80]; char satz[80]; geheim[0]=109; geheim[1]=97; geheim[2]=114; geheim[3]=105; geheim[4]=111; geheim[5]=110; geheim[6]='\0'; printf("\nLogin eingeben : "); gets(passwort); if(strcmp(geheim,passwort) == 0) { printf("\n\t Login OK\n\a"); } else { printf("\n\t Sie haben keine Zugriff Rechte\n\n\n"); exit(0); } while(wahl != 0) { printf("\n\n"); printf("\t_______________________________________________\n"); printf("\t|| ||\n"); printf("\t|| Programm mit verschiedenen Funktionen ||\n"); printf("\t||___________________________________________||\n"); printf("\n\n Prozentanzahl der Satzzeichen 1 Die Matrix 8\n"); printf("\n Satz Ausgabe ohne Leerzeichen 3 Ende 0\n"); printf("\n Rechner von Euro in Dm 12\n\n"); printf(" Eingabe: "); scanf("%i",&wahl); fflush(stdin); switch(wahl) { case 1: satzfunktion(); break; case 8: schnelle_matrix(); break; case 3: printf("\nGeben Sie eine Satz ein:\n"); gets(satz); while (satz[i]) { switch(satz[i]) { case' ': case',': case'.': case':': case'!': case'?': break; default: printf("%c",satz[i]); } i ++; } break; case 12: printf("\nBetrag eingeben: "); scanf("%f",&betrag); printf("\n%.2f Euro sind %.2f DM\n",betrag,betrag * 1.95583); break; } } }
MFG i
ch schaffe das schon
-
fflush(stdin); erzeugt undefiniertes Verhalten, da du fflush auf einen Eingabe Strom anwendest, dies doch nur für Ausgabe Ströme möglich ist!
Auf gets solltest du aus Sicherheitsgründen Verzichten! Benutze lieber fgets
-
wie macht mann das dann, ohne fflush. hab' da zwar schon einige möglichkeiten gesehen, aber welche ist die 'beste'?
CU
-
Das Problem ist, dass scanf() beim ersten Zeichen, das nicht mehr dem gesuchten Muster entspricht, aufhoert zu lesen. Im Idealfall ist das das Zeilenende ('\n'), wenn man Pech hat, dann halt irgendwas anderes. Im letzteren Fall wird ein erneutes scanf() vermutlich nicht das erwartete Ergebnis liefern. Man kriegt das zwar schon wieder synchronisiert, aber am besten vermeidet man so was einfach schon im Vorfeld. Man kann z.B. zuerst die ganze Zeile mit fgets()in einen Puffer einlesen und den dann mit sscanf() zerdroeseln.
Aber ok, wenn man's wirklich nur mit scanf() machen will, dann gibt's dazu zwei Dinge zu sagen. Zum einen sollte man den Rueckgabewert von scanf() nicht ignorieren und pruefen, ob tatsaechlich die erwartete Anzahl von Feldern gelesen wurde. Was man auch tun sollte, ist mit fgetc(stdin) zu pruefen, welches Zeichen zum Abbruch gefuehrt hat. Wenn fgetc() ein '\n' oder EOF liefert, dann ist alles ok. Wenn nicht, dann enthielt die Eingabezeile unerwartete Zeichen. In dem Fall liegt ein Eingabefehler vor und man sollte in einer Schleife mit fgetc(stdin) so viele Zeichen auslesen, bis ein '\n' gelesen oder das Fileende (ja, das gibt's auch bei stdin!) erreicht wurde. Danach hat man wieder seine Ruhe.