überprüfen ob string = ganzzahl



  • Wieso hat noch keiner

    std::string str("6846");
    if(str.find_first_not_of("0123456789") == std::string::npos)
         std::cout << "Nur ganze Zahlen!";
    

    Das Problem mit den Leerzeichen lässt sich auch ganz einfach einfügen (durch ein zusätzliches Leerzeichen im Parameter von find_... ).

    Und was nman meint, da kann man nur noch vom Stream einlesen und diesen nach Fehlern abfragen.
    BTW: Ganze Zahlen bestehen auch aus den negativen - ihr meint wohl die Menge N0N_0 (Das spezielle N \N geht nicht...).


  • Mod

    Sone schrieb:

    Wieso hat noch keiner

    std::string str("6846");
    if(str.find_first_not_of("0123456789") == std::string::npos)
         std::cout << "Nur ganze Zahlen!";
    

    Weil das wieder eine ineffiziente Unsinnslösung ist. Siehe mein Kommentar gestern zu deinem Vorschlag für den armen Kerl mit der Laufschrift. Immerhin hast du dieses Mal wenigstens eine höhere Abstraktionsebene erreicht, da der Code auch zur Überprüfung anderer Kriterien geeignet ist. Dafür hast du nun aber Laufzeitkosten auf dich genommen. 👎 Tachyons Lösung ist in dem gleichen Stil wie deine, ist aber effektiv das gleiche wie eine naive Prüfschleife elegant geschrieben.



  • SeppJ schrieb:

    Sone schrieb:

    Wieso hat noch keiner

    std::string str("6846");
    if(str.find_first_not_of("0123456789") == std::string::npos)
         std::cout << "Nur ganze Zahlen!";
    

    Weil das wieder eine ineffiziente Unsinnslösung ist. Siehe mein Kommentar gestern zu deinem Vorschlag für den armen Kerl mit der Laufschrift. Immerhin hast du dieses Mal wenigstens eine höhere Abstraktionsebene erreicht, da der Code auch zur Überprüfung anderer Kriterien geeignet ist. Dafür hast du nun aber Laufzeitkosten auf dich genommen. 👎 Tachyons Lösung ist in dem gleichen Stil wie deine, ist aber effektiv das gleiche wie eine naive Prüfschleife elegant geschrieben.

    Ja, hast Recht. Meine ist ca. 1,5 mal langsamer als seine... 😞



  • SeppJ schrieb:

    Laufzeitkosten

    Wenn es danach geht wuerde ich ja das so machen:

    bool number_string1(char const* p, int length)
    {
        return (length==0) ? true : (isdigit(*p) || isspace(*p)) && number_string1(++p, --length);
    }
    

    Leider schafft es Visual Studio nicht zu optimieren, deswegen muss ihm etwas unter die Arme gegriffen werden:

    bool number_string2(char const* p, int length)
    {
        if (length==0) return true;
        if (isdigit(*p) || isspace(*p)) return number_string2(++p, --length);
        return false;
    }
    

  • Mod

    knivil schrieb:

    SeppJ schrieb:

    Laufzeitkosten

    Wenn es danach geht wuerde ich ja das so machen:

    Na bitte! So sieht eine interessante neue Lösung aus. Hast du das mal mit Tachyons Variante (mit isdigit und isspace mittels Lambda oder Funktor kombiniert) verglichen?



  • Nein. Ich habe mal isspace bei mir weggelassen. Der Unterschied betraegt etwa 10% zu meinen Gunsten bei einem String mit nur Ziffern. SSE bringt VS 2012 bei mir nicht automatisch, daher kann es mit dem GCC anders sein. Natuerlich habe ich es darauf angelegt, dass der Compiler das in eine while-Schleife transformiert. Bei Variante A klappt das leider nicht mit VS 2012. Falls der String nicht nur Ziffern enthaelt hat meine Variante den Vorteil, fruehzeitig abzubrechen. Der naechste Schritt ist natuerlich SSE, aber dazu bedarf es schon riesiger Strings, damit das lohnt. Andere Optimierungsvarianten sind beispielsweise isdigit oder isspace e selbst zu implementieren, damit der Kompiler inlinen kann.

    Um mal eine Lanze fuer Sone zu brechen: Seine Loesung finde ich okay.



  • okay leute ich beschreibe mein problem nochmal... aber danke schonmal für die vielen antworten..

    ich schreibe ein elektronisches adressbuch und befasse mich gerade mit der fehlermeldung...um das problem zu lösen das bei der plz genau 5 zahlen eingegeben werden sollen habe ich das so gelößt

    struct Adresse
        string postleitzahl
    .........................
    char a;
    Adresse a;
    cout << "postleitzahl:";
    cin >> a.postleitzahl;
         while(a.postleitzahl.length() != 5)
         { 
          cout << "falsch\n";
          cout << "postleitzahl:";
          cin >> a.postleitzahl;
          }
    ..............
    datenbank.push_back(a);
    

    ich frage solange die plz ab bis der string 5 zeichen enthält klappt auch alles sehr gut ich will das selbe jetzt noch einbauen das wenn man statt einer zahl, ein buchstaben eingibt das er auch ne fehlermeldung raus schmeißt und so lange in der while schleife bleibt....



  • Und was missfaellt dir an den vorgestellten Loesungen? Wieso passen sie nicht darein?



  • welche der lösungen soll ich denn jetzt nehmen, da stehen ja echt ziemlich viele


  • Mod

    Die allererste ist schon ok, danach war quasi nur rumgealber, was man anders machen könnte. Du solltest den Rest des Threads aber möglichst auch noch mal vollständig und aufmerksam lesen, da kannst du viel lernen. Außerdem solltest du die vorgeschlagene Lösung auch nicht blind übernehmen, sondern nur, wenn du sie auch verstehst.


Anmelden zum Antworten