Überprüfen, ob Eingabe eine Zahl ist



  • 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 als

    1.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/O7fepk

    Weil 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.

    http://www.c-plusplus.net/forum/p2274937#2274937



  • 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. 👍


Anmelden zum Antworten