scanf wird überrannt
-
Das ist mein größtes Problem überhaupt.
In Schleifen (while) wird mein scanf das erste mal einfach übergangen, erst beim 2. mal wird auf eine Eingabe gewartet.Bei diesem Programm ergeben sich dadruch schwerwiegende Probleme:
#include <stdio.h> main() { float anzeige,eingabe; char funktion; anzeige=0; while(funktion!='a') { printf("==== Taschenrechner ====\n"); printf("Anzeige: %.6f\n",anzeige); printf("Funktion: (h ..Hilfe):"); [b]scanf("%c",&funktion);[/b] printf("Eingabe: "); [b]scanf("%f",&eingabe);[/b] switch (funktion){ case '+': anzeige=anzeige+eingabe; break; case'-': anzeige=anzeige-eingabe; break; case '*': anzeige=anzeige*eingabe; break; case'/': anzeige=anzeige/eingabe; break; case'c': anzeige=0; break; case'h': printf("Rechnerfunktionen:\nh ... dieser Test\n"); printf("a ... Rechner Ausschalten\nc ... Rücksetzen der Anzeige\n"); printf("+ ... Addition\n- ... Subtraktion\n* ... Multiplikation\n"); printf("/ ... Division"); break; } } }
Anscheinend mache ich etwas elementares Falsch. Bloß was?
Luka
-
Nach jedem scanf() ein
while(getchar()!='\n');
, und alles is gut
-
Ich weiß nicht wirklich warum, aber einige Funktionen wurden uns verboten.
(fflush, goto)
Ich habe die Befürchtung, auch getchar() fällt unter dieses Verbot.Falls nicht: Fällt mir ein Stein vom Herzen. Und ich bedanke mich für die wirklich schnelle und für mich sogar verständliche Antwort
bye
-
Dass euer Lehrer fflush() verbietet hat auch einen guten Grund. Viele Leute versuchen nämlich mit einem fflush(stdin) das zu erreichen was der Code von curry-king macht. Das fflush(stdin) geht zwar auf Microsoft Compilern wunderbar, aber halt nur auf denen. Microsoft war da mal wieder so nett eine kleine Erweiterung am ANSI Standard vorzunehmen, mit dem Effekt, dass man in unzähligen Skripten, Tutorials und Büchern (und natürlich hier im Forum) solchen inkompatiblen Bockmist vorfindet.
Vielleicht hat euer Lehrer das sogar deswegen verboten weil er von euch eine Lösung präsentiert haben will, die das Problem mit Standardmitteln löst (eben jener Code von curry-king). Dann (eigentlich nicht nur dann, sondern immer) wäre es wichtig verstanden zu haben was dieser Code denn macht. Hast du das?
PS: Es gibt schöne
Tags die das lesen deines Codes noch vieeeel schöner machen als es ohnehin schon ist
-
kleiner zusatz zu dem idiom, was ich auch oft verbreite. es heisst korrekterweise so:
int c; while ((c = getchar()) != EOF && c != '\n');
man muss auch auf EOF pruefen, weil sonst endlosschleifen kommen koennen.
c muss ein int sein, weil EOF nicht im bereich eines chars ist.
-
Man kann das auch ohne getchar kompakt schreiben als scanf("%*[^\n]\n") oder so, wobei das in der Tat etwas unheimlich aussieht.
-
Das kann doch echt nicht wahr sein das man immer den scheiss nach jeder Eingabe schreiben muss??
-
Daniel E. schrieb:
Man kann das auch ohne getchar kompakt schreiben als scanf("%*[^\n]\n") oder so, wobei das in der Tat etwas unheimlich aussieht.
Mir gefällts
Kurt
-
TactX schrieb:
Dass euer Lehrer fflush() verbietet hat auch einen guten Grund. Viele Leute versuchen nämlich mit einem fflush(stdin) das zu erreichen was der Code von curry-king macht. Das fflush(stdin) geht zwar auf Microsoft Compilern wunderbar, aber halt nur auf denen. Microsoft war da mal wieder so nett eine kleine Erweiterung am ANSI Standard vorzunehmen, mit dem Effekt, dass man in unzähligen Skripten, Tutorials und Büchern (und natürlich hier im Forum) solchen inkompatiblen Bockmist vorfindet.
Vielleicht hat euer Lehrer das sogar deswegen verboten weil er von euch eine Lösung präsentiert haben will, die das Problem mit Standardmitteln löst (eben jener Code von curry-king). Dann (eigentlich nicht nur dann, sondern immer) wäre es wichtig verstanden zu haben was dieser Code denn macht. Hast du das?
PS: Es gibt schöne
Tags die das lesen deines Codes noch vieeeel schöner machen als es ohnehin schon ist
Ich weiss nicht was ihr immer für Probleme habt, für normale kleine Programme ist fflush doch kein Problem, der User verkauft sein Produkt o.ä. doch nicht, dass es so wichtig wäre, wenn es was großes ist, wäre das was anderes, aber mein Gott, für normalen kleinen input ist das doch nichts, ist ja nicht so, dass das Programm da instabil wird...
-
Diamond schrieb:
Ich weiss nicht was ihr immer für Probleme habt, für normale kleine Programme ist fflush doch kein Problem, der User verkauft sein Produkt o.ä. doch nicht, dass es so wichtig wäre, wenn es was großes ist, wäre das was anderes, aber mein Gott, für normalen kleinen input ist das doch nichts, ist ja nicht so, dass das Programm da instabil wird...
Klar, ein Architekt gewöhnt sich beim Studium auch an, die tragenden Wände zuletzt hinzustellen - bei den kleinen Übungsmodellen stört es ja nicht, wenn sie etwas wacklig sind
(oder anders: Gewöhn dir lieber gleich einen vernünftigen Programmierstil an, ehe sich solche Fehler wie 'fflush(stdin);' einbürgern)
-
Diamond schrieb:
Ich weiss nicht was ihr immer für Probleme habt, für normale kleine Programme ist fflush doch kein Problem, der User verkauft sein Produkt o.ä. doch nicht, dass es so wichtig wäre, wenn es was großes ist, wäre das was anderes, aber mein Gott, für normalen kleinen input ist das doch nichts, ist ja nicht so, dass das Programm da instabil wird...
Ich verstehe ich nicht was das mit der Größe des Programms zu tun hat. Entweder man hält sich an den Standard und lässt sowas einfach, oder man scheisst auf den Standard und nutzt solche inkompatiblen Erweiterungen. Und dieses Forum hier heisst ANSI C, nicht MSVC C oder sowas. Und in ANSI C ist fflush(stdin) schlicht und einfach undefiniert, also falsch.
Was ist daran so kompliziert?