User soll nur Zahlen eingeben dürfen



  • hya ! 🕶

    wie wärs mit bissle zähplusplus ?

    int a;
    	cout << "Alert ! Achtung ! Attencion ! Cuidado ! Nachkomastellen werden ignorier !!!" << endl;
    	cout << "Bitte Zahl eingeben: ";
    	cin >> a;
    	while( cin.fail() )
    	{
    
    		cin.clear();
    		cin.ignore(numeric_limits<streamsize>::max(),'\n'); 
    	    cout << endl << "Fehlerhafte eingabe! " << endl;
    		cout << "Bitte Zahl eingeben: ";
    		cin >> a;
    	}
    


  • sieht super damit aus 😃
    nur ein problem nachdem ichs gerade getestet habe: bei nachkommastellen nimmt er den ersten wert vor dem punkt un den danach streicht er. an und für sich wunderbar, allerdings sagt er danach wieder fehlerhafte eingabe wenn ich das nochmal aufrufe, jmd. eine idee??

    edit: nicht nur bei nachkommastellen, sondern immer wenn nach der zahl eine ungültiges zeichen kommt.

    edit2: wie kann ich den eingabepuffer komplett leeren??



  • Versuch mal:

    std::cin.ignore( std::cin.rdbuf( )->in_avail( ) );
    

    greetz, Swordfish



  • ich gehe von aus das die stellen der zahl nicht bekannt sind oder `?



  • nein die stellen sind nicht bekannt, aber es war so wie ich es mir dachte: nachdem ich z.B. 1234sdf eingegeben habe, wird sdf zwar ignoriert, bleibt aber trotzdem im eingabepuffer. deshalb wollte ich wissen wie ich den leere.
    Danke klappt jetzt wunderbar.

    @Swordfish: deine Lösung (also mit read_number ()) hatte auch geklappt, sogar noch besser allerdings bin ich irgendwie unfähig strings in ints umzuwandeln...





  • hab schon weill alles nicht 🙄
    deshalb mein ich ja, ich bin zu blöd dafür aber ich mach mich nochmal ran jetzt 😃



  • Brusko schrieb:

    ich gehe von aus das die stellen der zahl nicht bekannt sind oder `?

    davon kann man i.d.R. ausgehen, es sei denn man kann hellseherprogramme schreiben 😃
    *fg*

    Fake oder Echt schrieb:

    bin ich irgendwie unfähig strings in ints umzuwandeln...

    dafür gibts doch atoi. guckst du bei <-dadda: 🙂

    #include <limits.h>	
    	char input[64];
    	int i=0;
    
    	while ( isdigit(input[i++] = getche()) ) 
    	{
    		if ( strtod( input, NULL ) > INT_MAX )
    		{
    			puts("touch too much!");
    			return 1;
    		}
    	}
    	if ( input[--i] != 13 ) puts("\npfui !!!");
    	else
    	printf("input: %d\n", atoi(input)); // <-dadda !
    


  • joa naja für char arrays gehts aber nicht für strings 😃
    aber ich habs jetzt endlich hingekriegt (zumindest fast :D)
    musste bei swordfish' lösung das _getch () vom anfang in eine for-schleife reinhauen, weil sonst kleine puffer entstanden zwischen den eingaben (also so leereingaben) sieht jetzt so aus:

    string read_number () {
    
        string input;
        int ch;
    
        for (ch = _getch (); ch != '\r'; ch = _getch ())
        {
            if (isdigit (ch))
            {
                input += ch;
                putch (ch);
            }
        }
    
        putch (ch);
    
        return input;
    }
    

    jetzt wird aber beim sofortigen enter drücken eine zufallszahl eingesetzt, wenn eben nichts drin steht, das muss ich noch i-wie wegbekommen 😃



  • zu spät *g*



  • Fake oder Echt schrieb:

    joa naja für char arrays gehts aber nicht für strings 😃

    string str("123");
    	 cout << atoi(str.c_str());
    

    hihihi



  • *sich pfanne nehm und auf kopf hau*
    ok danke, wie schön, dass ich das andauernd hier i-wo sehe aber im ernstfall es nicht finde 😃
    naja das andere bleibt noch mal sehn was sich da ergibt 😃

    edit: sehr schön, dadurch konnte ich mir auch sstream sparen, d.h 28 kb weniger *g*



  • ehm und was passiert, wenn in str keine Zahl steht? (Tipp: 0 wird ausgegeben!)


Anmelden zum Antworten