fgets wird übersprungen wenn in switch()
-
Moin zusammen ich habe da ein Problem, das ich absolut nicht verstehe.
Bei dem folgendem Programm soll eine Verbindung zu einem anderen Rechner aufgebaut werden. Vorher muss der User einen Namen oder eine IP eingeben für die Server-Adresse.Mit scanf wird eingelesen was der User eingegeben hat.
Bei der Auswertung die als switch gemacht ist,
muss der User eine Adresse eingeben, die mit fgets eingelesen wird.
Danach werden die entsprechenden Routinen aufgerufen die zum sichern der Serveradresse wichtig sind.Danach der connect() usw......
Das Problem ist, dass es nicht zum einlesen per fgets kommt, sondern der Connect einen fehler bringt. Und das verstehe ich nicht, denn ich kann doch in einer switch-Anweisung wieder was einlesen, oder?
Kann mit da jemand helfen?
Vielen Dank
BastlWastlHier der Code(achja, alles wird unter UNIX progr. und if/else->genau das gleiche):
printf("Bitte geben sie an:\n1. Ip-Adresse oder \n2. Rechnername\nIhre Wahl? "); scanf("%d", &wahl); fflush(stdin); switch(wahl) { case 1: if(wahl ==1) { printf("Bitte geben Sie eine IP-Adresse an!"); fflush(stdin); fgets(buffer, 80, stdin); if(inet_aton(buffer, &ServerAdr.sin_addr) < 0) perror("inet_aton"); ServerAdr.sin_port = htons(47110); ServerAdr.sin_family = AF_INET; } break; /*weiterer Code.....*/
-
"fflush(stdin);" ist Käse (fflush ist nur für Ausgabe-FILE's definiert). D.h. du müsstest dich nach einer anderen Methode umsehen, um den Rest der Zeile, der nach dem scanf übriggeblieben ist, aus dem Tastaturpuffer zu schmeißen.
-
1. Was soll das if(wahl==1)?
2. fflush(stdin) ist nicht definiert. Also illegal.
-
CStoll schrieb:
"fflush(stdin);" ist Käse (fflush ist nur für Ausgabe-FILE's definiert). D.h. du müsstest dich nach einer anderen Methode umsehen, um den Rest der Zeile, der nach dem scanf übriggeblieben ist, aus dem Tastaturpuffer zu schmeißen.
fflush ist für Datentypen FILE definiert und stdin, stdout und stderr sind solche Datentypen, also kann man um den Eingabepuffer zu löschen den Befehl machen(Habe ich ja auch schon des öfteren mit Erfolg getan).
Daher sollte die Zeile doch richtig sein, oder nicht?In der MSDN steht es so:
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/vclib/html/_crt_stdin.2c_.stdout.2c_.stderr.asp
-
BastWastl schrieb:
CStoll schrieb:
"fflush(stdin);" ist Käse (fflush ist nur für Ausgabe-FILE's definiert). D.h. du müsstest dich nach einer anderen Methode umsehen, um den Rest der Zeile, der nach dem scanf übriggeblieben ist, aus dem Tastaturpuffer zu schmeißen.
fflush ist für Datentypen FILE definiert und stdin, stdout und stderr sind solche Datentypen, also kann man um den Eingabepuffer zu löschen den Befehl machen(Habe ich ja auch schon des öfteren mit Erfolg getan).
Daher sollte die Zeile doch richtig sein, oder nicht?CStoll hat aber "Ausgabe-FILEs" geschrieben.
BastWastl schrieb:
In der MSDN steht es so:
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/vclib/html/_crt_stdin.2c_.stdout.2c_.stderr.asp1. MSDN wenn du für Unix proggst? lol?
2. In der MSDN steht irgendwo auch, dass fflush(stdin) ein _Erweiterung_ von Microsoft ist.
edit: hier: http://msdn.microsoft.com/library/default.asp?url=/library/en-us/vclib/html/_crt_fflush.asp
-
1. MSDN wenn du für Unix proggst? lol?
Da stehen manchmal Sachen etwas schöner drin als in den Man-Pages
Aber eure Argumente habe ich verstanden.
Dann jetzt die Frage die natürlich kommen mussKennt jemand so einen Befehl um seinen stdin-Puffer zu löschen. Denn nach dem scanf steht ja noch '\n' im Puffer.
-
etwa so?
while(getchar() != '\n');