> 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 von scanf sollte jedoch auch ausgewertet werden (zwei if 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 ein if 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 kann scanf keinen int einlesen und gibt eine 0 zurück.

    Du hast ein int eingelesen. Das ist eine Zahlenwert und keine einzelnen Zeichen mehr.
    Da kannst du mit isdigit nichts mehr anfangen.

    Das else kannst du übrigens weglassen, denn das return 0 sollte in jedem Fall am Ende gemacht werden.


Log in to reply