"We are back" « oc.at

C - Frage bezgl. Schleife

charmin 27.12.2014 - 15:00 4256 18
Posts

charmin

Legend
Shrek Is Love
Avatar
Registered: Dec 2002
Location:
Posts: 15576
gudden tach!

Ich versteh einfach nicht, warum ich bei Eingabe eines Buchstabens in die Endlosschleife komme. Wenn ich ne Zahl eingebe macht er brav sein (iLoop=0) und hüpft aus der while-Schleife, wenn ich aber nen Buchstaben eingeb, !scanf dann 1 zurückliefert, er den if block ausführt, gibt er die Fehlermeldung aus, macht (iLoop=1), bleibt in der Schleife, aber führt mir nicht mehr das !scanf oben aus, sondern bleibt in der Endlosschleife.

Evtl kann mir wer weiterhelfen. Ich will einfach so lange eine Eingabe verlangen bis jemand ne Zahl eingibt. tia!

Code: C
int iLoop = 1;

while (iLoop == 1){
            if (!fscanf(stdin, "%lf", &flength)) {
                fprintf(stdout, "\nFehler: Sie haben keine Zahl eingegeben!\n");
                iLoop=1;
            } else { iLoop=0;}
        }
Bearbeitet von charmin am 27.12.2014, 15:06

cr0ssSyntaX

der quotenchinese
Avatar
Registered: Jan 2004
Location: /root/home
Posts: 1883
Verwende doch eine do-while Schleife dafür. Ist viel "sauberer".

Ist klar zu ersehen, dass du in der Endlosschleife bist, wegen dem iloop=1, auch, wenn keine Zahl eingegeben wurde. Per do-while brauchst du das iloop=1 nicht mehr.
"Springt er aus der Schleife auch wieder raus?" musst du dich fragen.

InfiX

she/her
Avatar
Registered: Mar 2002
Location: Graz
Posts: 14602
wenn mich nicht alles täuscht stand da am anfang noch eine do-while schleife im post :D

charmin

Legend
Shrek Is Love
Avatar
Registered: Dec 2002
Location:
Posts: 15576
ja stimmt, ging aber genauso wenig.

Ja er springt raus, wenn er mir endlich das blöde if mit scanf erneut ausführen würde, es kommt aber keine Eingabemöglichkeit, er ignorierts einfach und macht ne dauerschleife.

AdRy

Auferstanden
Avatar
Registered: Oct 2002
Location: Wien
Posts: 5239
Ist schon eine weile her, dass ich mit C was gemacht hab, aber wird der stdin stream nicht beendet wenn du es ausliest? Das würde auch erklären warum keine Eingabemöglichkeit kommt.

charmin

Legend
Shrek Is Love
Avatar
Registered: Dec 2002
Location:
Posts: 15576
hmm nur ist die frage wie ich das dann erledige.

Ich möchte einfach, dass man eine Zahl eingeben muss, wenn man einen buchstaben eingibt schreibt er hin "bitte zahl eingeben" und man muss erneut eingeben, und das so lange bis man ne Zahl eingibt.

Nico

former person of interest
Registered: Sep 2006
Location: -
Posts: 4082
ohne schleife mit rekursion eventuell.

AdRy

Auferstanden
Avatar
Registered: Oct 2002
Location: Wien
Posts: 5239
Vielleicht mal im debugger nachsehn was wirklich in stdin steht. Vl. liest er auch immer den alten stream und deswegen greift die if schleife dauernd und hängt endlos drinnen?

charmin

Legend
Shrek Is Love
Avatar
Registered: Dec 2002
Location:
Posts: 15576
ja, das muss fast so sein. urks. Nur leider kenn ich noch keine andere Möglichkeit auf Kontrolle der Eingabe auf Gültigkeit (= Zahl || kein Buchstabe)
Habs auch probiert einfach mit if (eingabe < 1.7E+308 && eingabe > 1.7E-308),
Das ist dann genau dasselbe. Ausser, wenn ich 0 eingebe, dann funktionierts...

AdRy

Auferstanden
Avatar
Registered: Oct 2002
Location: Wien
Posts: 5239
glaub ich hab deinen fehler gfunden: du liest nur einen wert/zahl aber im buffer hängt noch \n drinnen beim nächsten mal lesen -> triggert das if.

http://stackoverflow.com/questions/...put-buffer-in-c
http://c-faq.com/stdio/scanfc.html
http://c-faq.com/stdio/stdinflush2.html

vielleicht gehts mit getc() statt fscanf() und dann erst prüfen ob zahl oder ned.

Blaues U-boot

blupp, blupp
Avatar
Registered: Aug 2005
Location: Graz
Posts: 1542
eine saubere möglichkeit wäre imho einfach eine ganze zeile einzulesen und dann nachher den string verarbeiten/prüfen.
z.b. mit fgets()
der code wird dann natürlich ein paar zeilen länger.

charmin

Legend
Shrek Is Love
Avatar
Registered: Dec 2002
Location:
Posts: 15576
Soweit simma noch net und unser vollkoffer von prof erklärt uns nix, kanns ma erst wieder ausm www lernen. Danke fuer den tipp, ich werf mal google an

Nico

former person of interest
Registered: Sep 2006
Location: -
Posts: 4082
ich würd nebenbei ein (gratis) buch zur c-programmierung besorgen und so lernen, anstatt auf den prof zu warten.

charmin

Legend
Shrek Is Love
Avatar
Registered: Dec 2002
Location:
Posts: 15576
Ich warte nicht, ich suche mir mein wissen, keine sorge. Hab meine guten seiten dafür. ;) es dauert halt trotzdem etwas laengee

cr0ssSyntaX

der quotenchinese
Avatar
Registered: Jan 2004
Location: /root/home
Posts: 1883
Als Spielerei für dich kannst du auch eine temp var definieren und dann mit dem eingegebenen wert vergleichen. Und dann halt alles in der Schleife. Temp var wird immer wieder innerhalb der Schleife durchlaufen bis eine Zahl eingegeben wird, erst dann verlässt es die Schleife und macht mit dem regulären Code weiter.

Wenn der Prof nix gesagt hat, dann kannst du dich auch mit Rekursion spielen. Kommt auch auf das selbe Ergebnis. Nico hats schon erwähnt. Professionell ist es nicht, aber für den Anfang OK.
Kontakt | Unser Forum | Über overclockers.at | Impressum | Datenschutz