const char* auf inhalt überprüfen



  • Hallo an Alle,

    ich möchte gerne folgende 0peration durchführen:

    const char *buf;
    int zahl;
    
    // ... Funktion zum einlesen von *buf ...
    
    zahl = (int) atof(buf);
    

    Nun muss ich zuvor noch überprüfen, was in 'buf' drin ist, ehe ich es an 'zahl' gebe, die bewusst eine Integerzahl ist, da in 'buf' nur Integerzahlen erlaubt sein sollten.
    Wenn 'buf' aber zum Beispiel so etwas wie '4 2', '1.1' oder 'a' ist, will ich eine Fehlermeldung ausgeben. Wie kann ich das anstellen?

    VIELEN DANK!
    H.W.



  • Nimm doch einfach atoi statt atof.
    Wenn du mit der Validierung nicht klar kommst schau in die Doku zur Funktion.
    Falls du im richtigen Forum (C++) gepostet hast, schau in die FAQ, "Einmal String nach Zahl und zurück" oder so ähnlich, (und überleg dir ob char const* nicht ein 'Fehler' ist der durch std::string behoben werden könnte).



  • Erstmal gibt es auch die Funktion "atoi()", um int's zu parsen 😉 (das ist vermutlich besser, als nach float-Werten zu scannen und die dann umzuwandeln)

    Zweitens gibt es dazu noch die "Komplettversion" strtol(), die als Bonus noch zurückgeben kann, wo die erkannte Zahl zu Ende war:

    const char* buf;
    char* ende;
    int zahl = strtol(buf,&ende,10);
    if(*ende!='\0')
      cout<<"Fehler: \'"<<buf<<"\' ist keine Zahl";
    

    Und drittens: Nimm lieber Stringstreams oder lexical_cast<> für die Umwandlung (beim Stream kannst du hinterher per get() abfragen, ob noch etwas hinter der Zahl stand).



  • Danke für den Hinweis finix,

    nee, char const* ist leider kein Fehler. Meine Funktion zum einlesen von 'buf 'ist aus einer library und die möchte ich nicht modifizieren.

    Bye.
    H.W.

    // EDIT:
    an CStoll: Dein Vorschlag mit strtol funktioniert 'einmanfrei'. Vielen Dank!



  • wenn performance ned so wichtig ist (Eingabe ?):

    std::string myBuffer(buf ? buf : std::string()); // kopiert dir deine zeichenkete in den string .... und faengt nullzeiger ab

    und scho kannst mit strings arbeiten ^^

    Ciao ...



  • Falls du die boost libs verwendest, wuerde ich dir die lexical casts empfehlen.

    - georg


Anmelden zum Antworten