> 0 bei scanf?
-
Hi zusammen, ich hab ne kleine Verständnisfrage bezüglich des Rückgabewertes von Scanf().
Folgende Aufgabenstellung:
Schreibe ein Programm das eine benutzerdefinierte Zahl annimt
und allen Zahlen zwischen 0 und dieser Zahl ausgibt. Zahlen
<= 0 sollen das Programm beenden.#include <stdio.h> int main(int argc, const char *argv[]) { int r_in, i; if(scanf("%d", &r_in) > 0) { for (i = 0; i <= r_in ; i++) { printf("%d\n", i); } } else { return 0; } }
Komischerweise wird die 0 trotzdem ausgegeben obwohl ich beim if
statement > 0 angebe, woran liegt das? -1 funktioniert.
-
Guckste hier: http://en.cppreference.com/w/c/io/fscanf
C Referenz schrieb:
Number of receiving arguments successfully assigned, or EOF if read failure occurs before the first receiving argument was assigned.
-> Der Rückgabewert hat nichts mit dem eingelesenen Wert zu tun...
-
Ok ein wenig hab ich Verstanden, leider noch vieles: Bahnhof
Ich weiss z.B immer noch nicht, warum trotzdem eine 0 ausgegeben
wird, wenn ich die Schleife ausdrücklich nur aufrufe wenn die Eingabe > 0 ist?
-
Weil der Rückgabewert von scanf nichts mit dem eingelesenen Wert zu tun hat!
-
Du missverstehst anscheinend den Rückgabewert. Du musst
r_in
auf<= 0
überprüfen! Der Rückgabewert vonscanf
sollte jedoch auch ausgewertet werden (zweiif
s oder&&
).Hier findest du eine Beschreibung. Du willst exakt ein Eingabeelement einlesen, also überprüfe den Rückgabewert auf
== 1
.
-
Oh Gott ich geh mal vom Schlauch runter
Danke es hat klick gemacht ^^
-
Hast du deinen Code mittlerweile angepasst?
Du rufst die Schleife auf, wenn
scanf
(mindestens) einen Parameter erfolgreich eingelesen hast.Gibt mal Buchstaben ein.
Wenn die Eingabe 0 war, dann steht in r_in eben 0
Der erste Vergleich bei
for
ist dann 0 <= 0 . Und das ist wahr.
Also wird die Schleife ausgeführt.Du musst erst das
scanf
machen und dann danach einif
mit dem r_in > 0.
-
Erstmal ja, danke. Auf char überprüfen füg ich noch hinzu, wollte mir
auch mal isdigit() näher angucken.#include <stdio.h> int main(int argc, const char *argv[]) { int r_in, i; scanf("%d", &r_in); if(r_in > 0) { for (i = 0; i <= r_in ; i++) { printf("%d\n", i); } } else { return 0; } }
Danke für die schnelle Hilfe, ihr seid echt top!
-
Ne, das mit dem Buchstaben ist ein Test für deine Abfrage (im ersten Programm).
Dann kannscanf
keinenint
einlesen und gibt eine 0 zurück.Du hast ein
int
eingelesen. Das ist eine Zahlenwert und keine einzelnen Zeichen mehr.
Da kannst du mitisdigit
nichts mehr anfangen.Das
else
kannst du übrigens weglassen, denn dasreturn 0
sollte in jedem Fall am Ende gemacht werden.