string überprüfen mit isdigit ?



  • for( int i = 0; i < eingabe.size(); ++i )
    {
    if( !isdigit( eingabe[ i ] ) )
    //ungültige eingabe, abbrechen
    }

    Was ist denn mit diesem code, wird die die schleife so oft durchlaufen wie ziffern/buchstaben eingabe hat ? und die anweisung überprüft jede nacheinander ?



  • Elegant wäre statt int ein std::string::const_iterator , wenn schon nicht ein Iterator, dann wenigstens ein std::string::size_type , und wenn's dir zu lange zum Schreiben ist, dann wenigstens ein std::size_t .

    Funktion sehe ich übrigens noch immer keine 😉

    greetz, Swordfish



  • mir gings jetzt nu ebend drum ob ich die schleife verstanden hatte *g* nun ich bin ebend anfänger und werde wohl sicher einige fehler noch machen. Ob ich das nun in eine funktion hinbekomme weis ich noch nicht hab im Thread zuvor
    http://www.c-plusplus.net/forum/viewtopic-var-t-is-205658.html
    kurze fragen gestellt gehabt und warte noch auf anwort *g*



  • Du solltest Dich wirklich über Parameter informieren. atoi ist übrigens AFAIR nicht Standard. Nimm besser einen Stringstream.

    greetz, Swordfish



  • Parameter sind doch die Variablen die ich z.b in der funktion verwende oder ? was habe ich denn konkret falsch ?? evtl eine bestimmte stelle zu zum draufhinstossen ?



  • #include <iostream>
    
    int foo;
    
    void bar( ) {  // tu was mit foo, ohne parameter
    
        std::cout << foo << std::endl;
    }
    
    int main( ) {
    
        foo = 5;
    
        bar( );
    }
    
    #include <iostream>
    
    void bar( int parameter ) { // tu was mit dem parameter
    
        std::cout << parameter << std::endl;
    }
    
    int main( ) {
    
        int foo = 5;
    
        bar( foo );
    }
    

    greetz, Swordfish



  • naja ich glaube eines nach dem anderen ,,,fangen wir mit string prüfen an 🙂 da hänge ich noch 🙂



  • std::find_if ...



  • Naja ich hab es nu doch mit isdigit gemacht, ob es elegant ist kann ich nicht sagen aber es funktioniert soweit anscheinend.

    http://www.c-plusplus.net/forum/viewtopic-var-t-is-205731.html



  • Ehm weiß nicht was das da am Ende löst ... hab dein Problem da nicht ganz vor Augen ... generell findest du aber die erste Stelle, die kein Zeichen ist z.B. so:

    const std::string sample("01234a23c");
    std::string::const_iterator it(std::find_if(sample.begin(), sample.end(), std::not(std::ptr_fun(std::isdigit)));
    if (it == sample.end()) std::clog << "Alle Zeichen sind Zahlen!" << std::endl;
    else std::cerr << "Das Zeichen \'" << *it << "\' ist keine Zahl!" << std::endl;
    

    😉



  • Das problem war es eigentlich, ein string das 6 zeichen durch die eingabe von getnstr enthält zu überprüfen ob es eine gültige uhrzeitformat entspricht.
    wie 235959 ohne irgendwelche buchstaben oder kommas drin.

    dieses soll später in int mit atoi umgeändert werden ich weis nicht warum aber ich vergleiche lieber im programm int werte



  • int vergleich ist auch schneller als zeichen(array!) vergleich ...



  • sagen wir nes so ich habs gehofft das es evtl so ist aber sicher wuste ich es nicht 🙂 bin froh das es funktioniert ob es nu alles richtig waage ich dennoch zu bezweifeln. wenn ich nu im classen arbeite, habe ich da jetzt mit char jalousie[128][7] gearbeitet ist es da besser mit string zu arbeiten ?? warum ??



  • (D)Evil schrieb:

    Ehm weiß nicht was das da am Ende löst ... hab dein Problem da nicht ganz vor Augen ... generell findest du aber die erste Stelle, die kein Zeichen ist z.B. so:

    std::string::const_iterator it(std::find_if(sample.begin(), sample.end(), std::not(std::ptr_fun(std::isdigit)));
    

    (abgesehen davon, dass du wahrscheinlich std::not1 meinst: ) hier hat man wieder das problem, dass der compiler nicht weiß, welches isdigit gemeint ist.

    Brusko:
    der vorteil von std::string ? du hast ein unglaublich mächtiges interface zur verfügung. es ist einfacher, zeichenketten zu vergleichen, zu ändern, oder in ihnen etwas zu suchen:

    std::string::const_iterator it (sample.begin() + sample.find_first_not_of("0123456789"));
    

    wenn du bei der eingabe mit trennzeichen zwischen den einzelnen stunden/minuten/sekunden-werten arbeiten würdest, wäre es (1) lesbarer und (2) wahrscheinlich auch einfacher (verständlicher) zu bearbeiten:

    string time = "23:59:59";
    
    stringstream str(time);
    
    unsigned h, m, s;
    str >> h; str.ignore();
    str >> m; str.ignore();
    str >> s; str.ignore();
    
    if (h > 24) //fehler
    if (m > 59) //fehler
    if (s > 59) //fehler
    

    ansonsten lässt sich mit ein bisschen rechnerei deine zahl auch so zerlegen:

    int time = 235959;
    
    int hours = time / 10000;
    int minutes = (time / 100) % 100;
    int seconds = time % 100;
    

    du solltest das intern aber wohl tatsächlich besser einheitlich als sekunden speichern.



  • nun die zahl zerlegen brauche ich ja so nicht, ich habe mit ein time_t ein string wo z.b kommplet drin steht welcher tag und welche uhrzeit. Tag Montag beginnent mit 1 oder ebend die zeit 235959 nun will ich es später so abspeichern das z.b 1235959 steht. nicht jede sekunde und mintute extra. Ein ganze Zahl wo sogesehen alle drin ist evtl noch eine 0 oder 1 dazu für auf und ab.
    Nun mus ich mir noch raussuchen wo bzw wie mann eine zahl zu dran setzt...am stringt oder am int (wenn das geht bei int)

    mein code wird sicherlich nicht schön sein 🙂 aber wenn er nicht "falsch" ist möchte ich es erstmal so lassen und wenn ich mehr weis von programmieren kann ich es später noch gerne umschreiben. Welches auch sicherlich passieren wird.



  • pharmacy;


Anmelden zum Antworten