Kontrollieren ob die Eingabe eine Zahl ist



  • Hab' ich nicht gemacht, weil ich ihm dann auch noch hätte erklären müssen was numeric_limits ist. Außerdem ist's eher unwahrscheinlich, dass jemand so viel eingibt..

    Für unseren Anfänger:

    mit

    std::numeric_limits<Standard-Datentyp>::max()
    

    bekommt man den maximalen Wert, der in diesem Datentyp speicherbar ist. Mit streamsize ist das in diesem Fall eben die maximale Anzahl an Zeichen, die eingegeben werden kann. Man muss dafür die Header <limits> mit einbinden.
    Unnötiger Mehraufwand in diesem Fall, s' gibt sowieso keiner so viel ein, nimm einfach nen Wert der dir groß genug scheint (bei richtigen "Projekten" darfst du davon aber natürlich nicht ausgehen.), die 1000 hab ich nun schon oft bei richtigen Projekten gesehen und einfach mal auch genommen.



  • numeric_limits<streamsize>::max() ist ein Sonderwert, bei dem der Stream beliebig lang ignoriert. (Bis man auf das entsprechende Zeichen trifft.)



  • Tja, danebengeraten.
    Ich hab mir das einfach nur vom Namen abgelitten. Wär auch mal wieder viel zu verständlich, dass streamsize = Größe des Eingabepuffers ist (ist der etwa "beliebig" lang oder was?).



  • cooky451 schrieb:

    numeric_limits<streamsize>::max() ist ein Sonderwert, bei dem der Stream beliebig lang ignoriert. (Bis man auf das entsprechende Zeichen trifft.)

    Wieso sollte das ein Sonderwert sein? Das ist ein Integerwert. Der ignoriert bestimmt nichts. Incognito hat es genau richtig beschrieben, zumindest bis dahin, wo er sagt, dass eh niemand so viel eingibt. Dafür gibts dann ja den Delimiter.



  • Tachyon schrieb:

    cooky451 schrieb:

    numeric_limits<streamsize>::max() ist ein Sonderwert, bei dem der Stream beliebig lang ignoriert. (Bis man auf das entsprechende Zeichen trifft.)

    Wieso sollte das ein Sonderwert sein?

    streamsize ist ein typedef auf int / long . Vielleicht prüft ja intern istream::ignore auf n = numeric_limits<streamsize>::max() (und falls das wahr ist, wird beliebig lang ignoriert). Plausibel wärs. 🙂
    Sonst hat icognito aber auch nur halb Recht; Ich empfehle ihm den Satz von Murphy.



  • Hacker schrieb:

    Tachyon schrieb:

    cooky451 schrieb:

    numeric_limits<streamsize>::max() ist ein Sonderwert, bei dem der Stream beliebig lang ignoriert. (Bis man auf das entsprechende Zeichen trifft.)

    Wieso sollte das ein Sonderwert sein?

    streamsize ist ein typedef auf int / long . Vielleicht prüft ja intern istream::ignore auf n = numeric_limits<streamsize>::max() (und falls das wahr ist, wird beliebig lang ignoriert). Plausibel wärs. 🙂
    Sonst hat icognito aber auch nur halb Recht; Ich empfehle ihm den Satz von Murphy.

    Plausibel wäre, dass der Stream einfach nicht mehr aufnehmen kann, als der Endwert des Typs zur Repräsentation der Größe angibt. Da der Stream nicht aufnehmen kann kann, muss man dann auch nicht beliebig lange ignorieren, sondern eben nur so lange, bis nicht die maximal mögliche Kapazität erreicht wurde.
    Was der Stream dann damit vielleicht macht, ist Spekulation und vermutlich implementierungsabhängig.


  • Mod

    Tachyon schrieb:

    Was der Stream dann damit vielleicht macht, ist Spekulation und vermutlich implementierungsabhängig.

    Es gibt da so ein Dokument, das nennt sich C++-Standard. Sollte man mal überflogen haben. Da muss sich die Implementierung dran halten. Dann muss man auch nicht spekulieren oder sich selber zusammenreimen.

    cooky451 hat natürlich Recht.



  • SeppJ schrieb:

    [...]Es gibt da so ein Dokument, das nennt sich C++-Standard. [...]

    Dann les' noch mal. Wie Du aus der Aussage im Standard cookies Aussage ableitest, ist mir nicht ganz klar.



  • Tachyon schrieb:

    SeppJ schrieb:

    [...]Es gibt da so ein Dokument, das nennt sich C++-Standard. [...]

    Dann les' noch mal. Wie Du aus der Aussage im Standard cookies Aussage ableitest, ist mir nicht ganz klar.

    Siehe 27.7.2.3, Klausel 25, 1. Punkt. Das ist eine Implikation.

    (Edit)

    C++-Standard schrieb:

    Characters are extracted until
    any of the following occurs:
    - if n != numeric_limits<streamsize>::max() (18.3.2), n characters are extracted



  • Und das impliziert, wenn n == numeric_limits<streamsize>::max() wird beliebig lange konsumiert? Das halte ich doch für eine sehr gewagte Implikation.


  • Mod

    Tachyon schrieb:

    Und das impliziert, wenn n == numeric_limits<streamsize>::max() wird beliebig lange konsumiert? Das halte ich doch für eine sehr gewagte Implikation.

    😕 Was ist daran gewagt? Das ist handfeste Logik.

    Da steht: Wenn nicht (B und C), dann A. Mit B "n erreicht" und " C "n ist nicht max" und A "es wird weiter extrahiert". Daraus folgt: Wenn nicht C, dann A.



  • Na gut. Hast recht. Man (ich) sollte vielleicht alles lesen, und nicht nur die Beschreibung der Sonderfälle.


Anmelden zum Antworten