scanf Befehl; return EOF?
-
servus,
habe in meiner FH im Rahmen des erlernes der sprache c folgende aufgabe gestellt bekommen:
Schreiben Sie ein C-Programm, das eine unbekannte Anzahl von Float-Zahlen in ein Array einliest, das 6 Elemente groß ist. Berechnen Sie anschließend den Mittelwert und von jedem eingegebenen Wert die Abweichung vom Mittelwert.
Wenn mehr als 6 Zahlen eingelesen werden, soll eine Fehlermeldung erfolgen und das Programm beendet werden. Da Sie eine beliebige Anzahl Zahlen einlesen sollen, informieren Sie sich bitte über die scanf-Anweisung, wie das Problem gelöst werden kann. Es ist auch möglich auf eine Dateiendekennung bei einer Terminaleingabe abzufragen.
nun hab ich was rumprobiert und versucht einen fehler im scanf zu erzeugen um mich an das verhalten ranzutasten und dann rückschlüße darauszuziehn. nur ich schaffe es nicht scanf auf ein EOF oder ähnlich laufen zu lassen.
Folgende Probleme hab ich daher:
- Kann man in einem scanf in dem 6 variablen zum einlesen definiert sind, auch nur 4 oder 2 einlesen ? (ich wurde bisher gewzungen immer 6 variablen einzulesen, vorher gings nicht weiter)- kann mir scanf einen fehler liefern, wenn ich 6 zahlen einlesen will aber z.b. 7 angebe? (scanf lieferte mir dann immer den maximal wert 6 zurück, wenn ich mehr einlesen passierte nix).
oder kann mir sonst jemand sage wie man das lösen müsste?
für tipps wäre ich dankbar.
-
allkazam schrieb:
- Kann man in einem scanf in dem 6 variablen zum einlesen definiert sind, auch nur 4 oder 2 einlesen ? (ich wurde bisher gewzungen immer 6 variablen einzulesen, vorher gings nicht weiter)
Ja, kannst du - scanf() liefert dir die Anzahl der Variablen zurück, die es erkannt hat. (EOF kommt nur raus, wenn schon die erste Eingabe Müll war)
- kann mir scanf einen fehler liefern, wenn ich 6 zahlen einlesen will aber z.b. 7 angebe? (scanf lieferte mir dann immer den maximal wert 6 zurück, wenn ich mehr einlesen passierte nix).
Nein, macht es nicht - wenn der Formatstring abgearbeitet ist, lässt es den Rest der Eingabe stehen.
oder kann mir sonst jemand sage wie man das lösen müsste?
Ich würde in einer for()-Schleife jeden Wert einzeln einlesen, bis entweder ein Fehler auftritt oder die Arraygröße überschritten ist.
-
allkazam schrieb:
oder kann mir sonst jemand sage wie man das lösen müsste?
ich mag scanf nicht und rate immer davon ab. Wenn man scanf nur mit Zahlen arbeitet, kann meistens nicht viel (schlimmes) passieren, aber wenn du ein String lesen willst, dann wirst du die Welt nicht mehr verstehen.
Mein Tipp: Mit man: fgetc(3) oder man: fgets(3) die ganze Zeile einlesen (egal was sie hat) und dann parsen (z.b. mit man: strtok(3) oder sscanf. Wenn du ein String mit scanf liest, kann passieren, dass beim nächsten scnaf der Benuter nichts einzugeben braucht, weil es bereits Zeichen im Puffer waren. Als Anfänger kann dieses Verhalten ziemlich verwirrend sein, weil man nicht weiß, was da vor sich geht.
-
danke für die antworten soweit. wie kann man den, wie in der aufgabenbeschreibung, auf ein dateiendekennzeichen bei terminals abfragen?
die sache mit der for schleife und dem einlesen einzel kam mir auch schon, scheint mir aber im rahmen der aufgabenstellung nicht das ziel zu sein.