Überprüfen, ob Eingabe eine Zahl ist
-
Hallo liebe Community,
ich bin auf der Suche nach einer Möglichkeit, dass überprüft wird, ob das was eingegeben wurde auch eine Zahl ist.
Man soll nur positive Zahlen eingeben können, ansonsten eine Fehlermeldung bekommen. Hab schon if(n<0) und bräuchte jetzt sowas wie if(n keine zahl)Hat da jemand eine Idee?
Schonmal vielen Dank!
-
Lies einen String ein und wandel den in eine Zahl um. Dann kannst Du auch überprüfen, ob was anderes im String steht.
-
Guckst du strtod
http://www.cplusplus.com/reference/cstdlib/strtod/
endptr verrät dir ob etwas im String ist, was nicht in eine Zahl umgewandelt wurde.
-
Aber selbst wenn keine 'Fremdelemente' im String sind gibts keine Garantie, dass auch wirklich alles in eine Zahl konvertiert wurde.
char *eptr, *s = "1.1111111111111111111111111111111111111111111111111111111111111111111111111249"; double num = strtod ( s, &eptr ); printf ( "%lf\n", num ); printf ( "%d %s\n", *eptr, eptr );
Da muss man sich noch mehr einfallen lassen.
-
Was wilst du uns damit sagen
Kommt bei dir etwas anderes heraus als1.111111 0
?
-
DirkB schrieb:
Was wilst du uns damit sagen
Nicht mehr als da steht.
Welchen Teil des Satzes verstehst du nicht?*scnr*
Es kann vorkommen das der Benutzer mehr eingibt, als in ein double passt, das 'merkt' strtod nicht.
Ist klar jetzt?
-
CJosef schrieb:
Ist klar jetzt?
Ja!
-
Darum ging es doch gar nicht.
Das ist eine gültige Zahl und das wurde von strtod auch so angenommen.
-
Ja, ist klar.
Eventuell möchte man ja auch mit eingegebenen Zahlen im Programm rechnen.
Ob eine Zahl gültig ist sehe ich auch so, dafür brauche ich kein Programm.
Ich finde meinen Hinweis ganz nützlich, aber wenn du meckern willst, bitte.
-
CJosef schrieb:
Es kann vorkommen das der Benutzer mehr eingibt, als in ein double passt, das 'merkt' strtod nicht.
Doch, gerade strtod merkt das im Gegensatz zu scanf("%lf") und zeigt es auch an.
Über/Unterläufe kann man bequem abfragen, übergenaue Dezimalstellengenauigkeit wird entsprechend DBL_DIG gerundet, genauso genau, wie es mit einem Fließkommaliteral auch geschehen würde.
-
Wutz schrieb:
Doch, gerade strtod merkt das im Gegensatz zu scanf("%lf") und zeigt es auch an.
Hmm ... dann hast du ein anderes strtod als ich. Meins verkürzt(rundet) den obigen String um beträchtliches bei der Konvertierung und zwar still und leise, *endptr ist danach 0.
Wutz schrieb:
Über/Unterläufe kann man bequem abfragen,
Ich habe mich fast dusselig gegoogelt aber nichts gefunden, wie denn?
isinf?Was ich mich noch frage ist z.B.
double a = DBL_MAX, b = a + 1;
Müsste das nicht auch iwie nen Überlauf erzeugen?
Die Zahlen werden sogar als gleich bewertet, das ist doch der Hammer!
https://ideone.com/O7fepk
-
CJosef schrieb:
Müsste das nicht auch iwie nen Überlauf erzeugen?
Die Zahlen werden sogar als gleich bewertet, das ist doch der Hammer!
https://ideone.com/O7fepkWeil es gerade vorgestern in einem anderen Thread so schön erklärt wurde:
SeppJ schrieb:
C ist eben keine Sprache für den Ponyhof. Wenn du das willst, nimm Java oder ähnliches. Dafür ist C schnell. In C wird davon ausgegangen, dass der Programmierer weiß, was er tut. Keinerlei Sicherheitsprüfungen zur Laufzeit, es sei denn der Programmierer programmiert sie sich selber. Und zur Compilezeit wird ebenfalls gemacht, was der Programmierer sagt, es sei denn es ist technisch unmöglich.
-
DirkB schrieb:
Weil es gerade vorgestern in einem anderen Thread so schön erklärt wurde:
Ah, sorry das ich nicht jeden Tag 24h um die Uhr alle Threads detailliert verfolge.
Okay, es liegt an der Ponyhof-Inkompatibilität, jetzt bin ich im Bilde.