Problem mit scanf()



  • Hallo,
    Ich möchte mit

    scanf("%i",&laenge)
    

    die länge einer zufällig generierten zahlenfolge bestimmen, wobei ungültige eingaben gefiltert werden sollen.
    Wenn ich z.b. 12e3 eingebe, ist laenge = 123
    wenn ich hingegen e123 eingebe, ist laenge = 0;

    Ein lösungsansatz von mir war, eine while-schleife zur erneuten Abfrage zu verwenden:

    int laenge = 0;
    cout << "Bitte gib eine Zahl ein: ";
    scanf("%i",&laenge);
    while (laenge == 0)
    	  {
    		  cout << "Bitte gib eine Zahl ein: ";
    		  scanf("%i",&laenge);
    	  }
    

    Wenn ich bei der ersten Abfrage als erstes zeichen eine Zahl nehme, funktioniert es und das Programm läuft wie gewollt weiter. Wenn ich jedoch als erstes einen Buchstaben schreibe (z.B. z123), bleibt laenge = 0 und die while schleife scheint die Abfrage zu ignorieren, wodurch das Programm in eine Endlosschleife gerät. weiß jemand eine Lösung (vielleicht sogar eleganter) für mein Problem, indem ich aus

    scanf("%i",&laenge)
    

    bei Eingabe von z123 auch laenge = 123 bekomme, oder die while-schleife die Abfrage startet?
    Danke schon mal im Voraus. 😉



  • scanf liest nur Zeichen ein, die zu dem jeweiligen Formatspecifier passen.
    Bei %i sind das mögliche Vorzeichen ('+', '-') und die Ziffern.
    Der Rest bleibt im Eingabestrom stehen.

    Da (in deinem Beispiel) scanf immer wieder den Buchstaben vorfindet, liest es auch nichts ein.

    laenge wird in dem Fall auch nicht auf 0 gesetzt, sondern bleibt unverändert.

    Ob scanf beim lesen erfolgreich war, kannst du am Rückgabewert von scanf erkennen.

    Du kannst z.B.
    - die ganze Zeile einlesen, in dem String nach der ersten Ziffer suchen und ab dort dann Wandeln.
    - die ganze Zeile einlesen und mit regulären Ausdrücken auswerten
    - versuchen, ob du etwas mit dem %[ oder %[^ Formatspecifiern etwas machen kannst: scanf("%*[^0-9\n]%i", &laenge);



  • Wieso nutzt du scanf und nicht cin?



  • Danke erstmal für die ausführliche Antwort. Ich werde mal schauen wie sich das umsetzen lässt. 👍

    Nathan schrieb:

    Wieso nutzt du scanf und nicht cin?

    Mir ging es darum, dass falls jemand z.b. w12 eingibt, nur 12 gespeichert wird.
    scheint aber nicht so zu funktionieren wie gedacht.



  • Dann lies per cin oder getline(cin, str) einen String ein und schmeiss da alle ungültigen Zeichen raus oO


Log in to reply