User soll nur Zahlen eingeben dürfen
-
Naja der Titel sagt ja schon alles.
Also ich habe jetzt schon fast 2 Stunden gesucht, aber nichts ordentliches gefunden (nur Beispiele mit Zahlen zwischen 1 und 9, Stichwort ASCII).
Entweder bin ich zu blöd zum suchen oder ich hab zu viel Pech beim finden.
Wie gesagt, der User soll nur Zahlen (egal wie groß, aber Ganzzahlen also int) eingeben dürfen. Hat dafür jmd. eine Lösung, einen Link oder ähnliches?Danke im voraus, Fake oder Echt
-
Hi!
Mit Standardmitteln bleibt Dir nichts anderes übrig, den Benutzer eingeben zu lassen (uU. was er will) und dann zu bewerten, ob seine Eingabe korrekt war, oder nicht.
Unter windows gibt's_getch( )um einen Tastendruck zu lesen:#include <cctype> #include <string> #include <iostream> namespace conio { # include <conio.h> } std::string read_number( ) { std::string input; int ch = conio::_getch( ); while( ch != '\r' ) { ch = conio::_getch( ); if( std::isdigit( ch ) ) { input += ch; conio::_putch( ch ); } } conio::_putch( ch ); return input; } int main( ) { std::string input( read_number( ) ); std::cout << "\n" << input << std::endl; }greetz, Swordfish
-
ah ok danke kommt mir bekannt vor

also die funktion _getch () usw.^^okay danke, nach dem ganzen suchen dachte ich schon, das wär komplex(er) aber das geht ja

ich probier das jetzt mal und falls noch was auftaucht sag ich bescheid
-
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...
-
Guckst Du:
C/C++ Forum :: FAQ - C++ :: Einmal Zahl nach String und zurückgreetz, Swordfish
-
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!)