Zahlen aus String in int Variable schieben?



  • Ich möchte gerne über die Tastatur ein Datum eingeben lassen, das ich in einem String speichere. Gibt es eine Funktion mit der ich Zahlen aus einem String in einem int speichern/schieben kann?

    Würde den String dann nach den '.' absuchen und dann einfach davon ausgehend die zahlen in die Variablen für Tag, Monat und Jahr schieben.

    Danke für Antworten.



  • Hi,

    guck mal hier:
    http://www.c-plusplus.net/forum/viewtopic-var-t-is-39488.html

    FAQ ist immer ganz hilfreich. 😉



  • oha..., danke.
    👍



  • Souljumper schrieb:

    Ich möchte gerne über die Tastatur ein Datum eingeben lassen, das ich in einem String speichere.

    .. brauchst Du den String später noch; nachdem Du die int's heraus gelesen hast?

    Souljumper schrieb:

    Gibt es eine Funktion mit der ich Zahlen aus einem String in einem int speichern/schieben kann?

    Den Hinweis auf die FAQ hast Du ja schon. Grundsätzlich ist der std::istream immer die erste Wahl.

    Souljumper schrieb:

    Würde den String dann nach den '.' absuchen und dann einfach davon ausgehend die zahlen in die Variablen für Tag, Monat und Jahr schieben.

    Warum so kompliziert. Lies doch das Datum einfach gleich 'von Tastatur' ein.

    Mal angenommen, Du hast eine Klasse, die das Datum repräsentiert, dann erweitere diese um eine friend-Funktion ..

    #include <iostream>
    
    class Datum
    {
    public:
        Datum() : m_tag(1), m_monat(1), m_jahr(1900) {}
    
        // Format tag.monat.jahr
        friend std::istream& operator>>( std::istream& in, Datum& dt_ )
        {
            Datum dt;
            char pkt1, pkt2;
            if( in >> dt.m_tag >> pkt1 >> dt.m_monat >> pkt2 >> dt.m_jahr )
            {
                if( pkt1 == '.' && pkt2 == '.' )  // *1)
                    dt_ = dt; // nur wenn richtiges Format gelesen, Datum übernehmen
                else
                    in.setstate( std::ios_base::failbit ); // sonst Fehler setzen
            }
            return in;
        }
    private:
        int m_tag, m_monat, m_jahr;
    };
    

    *1) hier kann man z.B. noch prüfen, ob die Werte für Tag Monat und Jahr in den richtigen Intervallen liegen.

    .. und die Anwendung ist ganz einfach

    #include <sstream>
    // class Datum wie oben
    int main()
    {
        using namespace std;
        stringstream buf("28.7.2003 28;7.2003");
        Datum dt1;
        if( buf >> dt1 )
            cout << "1.Datum gelesen " << endl;
        Datum dt2;
        if( !(buf >> dt2) )
            cout << "Fehler beim 2.Datum lesen " << endl;
        return 0;
    }
    

    Wenn Du jetzt an Tag, Monat und Jahr rankommen möchtest, kannst Du zur class Datum noch Get-Methoden hinzufügen. Aber was möchtest Du denn nach dem Lesen mit Tag.Monat.Jahr machen?

    Gruß
    Werner



  • also wie du vermutlich schon festgestellt hast, versuch in die c++ programmierung einzusteigen. Ich arbeite derzeit an einer mini-anwendung, die aus 2 klassen und main-Methode besteht.

    Eine Klasse soll Mitglieder eines Vereins erfassen, wobei ich von einem Member den Name, Geburtsdatum und eine ID-Nummer erfasse. Das Geburtsdatum soll von der Tastatur eingelesen werden.

    Diese eingabe will ich dann in die int Variablen Jahr, MOnat und Tag schieben.

    So ist erstmal der vorläufige Plan. Bis auf die Eingabe des Datums über die TAstatur hab ich das alles soweit hinbekommen. Mit dem was du mir da geschrieben hast, komme ich aber denke ich erstmal weiter.

    Danke auch dafür.



  • Ok, ich kriegs nicht gebacken.

    Ich will

    1.)String einlesen

    2.)Stelle 1-2 eine int Variable speichern

    3.)Stelle 3-4 in eine int Variable speichern

    4.)Stelle 5-8 in eine int Variable speichern

    Gibs nicht eine Funktion wie "Substring" wo ich sagen kann, hol mir aus dem string ab der stelle x in der lange y alles und schiebe das in eine Variable?



  • Doch, es gibt eine substr-Metode in der Klasse string:
    http://www.cs.wisc.edu/~hasti/cs368/CppTutorial/NOTES/STRING.html



  • ah.....also doch, wieder mal den wald vor lauter bäumen nicht gesehen.

    wie kann ich einen stringstream leeren?

    Ich hab über google die möglichkeit

    stream.seekg(0);
        stream.seekp(0);
    

    gefunden, funktioniert aber nicht. Sobald ich den stringstream einmal benutzt hab um 2 zahlen in einen int zu schieben scheint es nicht mehr zu funktionieren, wieso? Dachte zuerst es liegt daran das der stream schon benutzt wurde....

    Hier mal meine main methode...

    #include <iostream>
    #include <sstream>
    #include <string>
    #include "Datum.h"
    #include "Member.h"
    
    std::string name, gebDatum;
    std::stringstream stream;
    int jr, mn, tg, id = 0;
    
    void clrStream(std::stringstream&);
    
    int main()
    {
        id++;
    
        std::cout<<"Geben Sie bitten den Namen des anzulegenden Mitglieds an"<<std::endl;
        std::cin>>name;
    
        std::cout<<"Geben Sie das Geburtsdatum der Person im Format TT.MM.JJJJ an"<<std::endl;
        std::cin>>gebDatum;
    
        stream << gebDatum.substr(0,2);
        stream >> tg;
    
        clrStream(stream);
        stream << gebDatum.substr(2,2);
        stream >> mn;
    
        clrStream(stream);
        stream << gebDatum.substr(4,4);
        stream >> jr;
    
        std::cout<<"Tag: "<<tg<<std::endl;
        std::cout<<"Monat: "<<mn<<std::endl;
        std::cout<<"Jahr: "<<jr<<std::endl;
    
        Member b(id,name, tg,mn,jr);
    
        //std::cout<<b.getGeb();
    
        return 0;
    }
    
    void clrStream(std::stringstream& stream)
    {
        stream.seekg(0);
        stream.seekp(0);
    }
    


  • Kann es sein, daß du die Indizes falsch berechnet hat?

    TT.MM.JJJJ
    0123456789
    

    D.h. du benötigst substr(0,2) (Tag), substr(3,2) (Monat) und subst (6,4) (Jahr) für deine Aufsplittung.

    (aktuell gibst du dem Stream den String ".1" für den Monat - daraus lässt sich keine vernünftige Zahl bilden -> failbit gesetzt -> Stream vorübergehend unbenutzbar)



  • Hallo,

    Einen stringstream leert man übrigens mit stream.str("");

    Ciao



  • Souljumper schrieb:

    also wie du vermutlich schon festgestellt hast, versuch in die c++ programmierung einzusteigen. Ich arbeite derzeit an einer mini-anwendung, die aus 2 klassen und main-Methode besteht.
    [...]

    Ok. ich habe wohl zu viel vorausgesetzt. Aber Danke für das Feedback.

    Souljumper schrieb:

    Ok, ich kriegs nicht gebacken.

    Schade, bei einer detaillierteren Fehlerbeschreibung hätte ich vielleicht helfen können. 😉

    Souljumper schrieb:

    std::cout<<"Geben Sie das Geburtsdatum der Person im Format TT.MM.JJJJ an"<<std::endl;
        std::cin>>gebDatum;
    

    Versuch statt dessen mal

    std::cout<<"Geben Sie das Geburtsdatum der Person im Format TT.MM.JJJJ an"<<std::endl;
        char pkt;
        std::cin >> tg >> pkt >> mn >> pkt >> jr;
    

    Wenn in dem obigen #include "Datum.h" mein Vorschlag einer Datum-Klasse steckt, so kannst Du auch

    Datum dt;
        std::cin >> dt;
    

    schreiben. Ich hatte das vorher nicht explizit erwähnt. 🙄

    Gruß
    Werner



  • Zu deiner letzten Möglichkeit, dass war mir schon bewusst, ich wollte halt nur vermdeiden für jedes "int" einen eigenen std::cin zu verwenden.

    char pkt;
    
    std::cin>>tg>>pkt>>mn>>pkt>>jr;
    

    Das gefällt mir am besten :-), sieht aus der Sicht eines C++ Jungspunds am schicksten aus.

    Vielen Dank 🙂



  • Hab nun folgendes Problem:

    ich versuche mit

    std::cout<<b.getGeb();
    

    mir das Geburtsdatum eiens Mitarbeiters zu holen.

    Der Compiler spuckt mir den Fehler

    error: request for member `getGeb' in `b', which is of non-class type `Member ()(int, std::string, int, int, int)'

    aus.

    Ich verstehe nicht ganz wieso. Hier mal mein Source:
    Main

    #include <iostream>
    #include <sstream>
    #include <string>
    #include "Datum.h"
    #include "Member.h"
    
    std::string name, gebDatum;
    std::stringstream stream;
    int jr=0, mn=0, tg=0, id = 0;
    
    int main()
    {
        id++;
    
        std::cout<<"Geben Sie bitten den Namen des anzulegenden Mitglieds an"<<std::endl;
        std::getline(std::cin, name);
    
        std::cout<<"Geben Sie das Geburtsdatum der Person im Format TT.MM.JJJJ an"<<std::endl;
    
        char pkt;
    
        std::cin>>tg>>pkt>>mn>>pkt>>jr;
    
        std::cout<<"Tag: "<<tg<<std::endl;
        std::cout<<"Monat: "<<mn<<std::endl;
        std::cout<<"Jahr: "<<jr<<std::endl;
    
        Member b( int id, std::string name, int tg, int mn, int jr);
    
        std::cout<<b.getGeb();
    
        return 0;
    }
    
    MEMBER Classe
    #ifndef _Member_H
    #define _Member_H
    
    class Member
    {
        private:
        long id;
        std::string name;
        Datum geb;
    
        public:
        Member(long , std::string , int, int, int);
        ~Member() {}
        long getId() const {return id;}
        std::string getName() {return name;}
        std::string getGeb() { return geb.getDatum();}
    
        inline bool setName(std::string& i_name){
    
            if(i_name.size() > 1)
                    return true;
            else
            return false;
    
        }
    
    };
    
    Member::Member(long i_id, std::string i_name, int tg, int mn, int jr): id(i_id), geb(tg,mn,jr)
    {
        std::cout<<"Member Konstruktor"<<std::endl;
    
        if (!setName(i_name))
        i_name = "How knows";
    
    }
    
    #endif
    

    Datum Klasse

    #ifndef _Datum_H
    #define _Datum_H
    
    class Datum{
        private:
        int tag;
        int monat;
        int jahr;
    
        public:
        Datum(int tg, int mn, int jr);
        ~Datum(){}
        void setDatum(int tg, int mn, int jr);
        std::string getDatum();
    
    };
    
    Datum::Datum(int tg, int mn, int jr)
    {
        std::cout<<"Datum Konstruktor"<<std::endl;
        tag = tg;
        monat = mn;
        jahr = jr;
    }
    
    void Datum::setDatum(int tg, int mn, int jr)
    {
        tag = tg;
        monat = mn;
        jahr = jr;
    }
    
    std::string Datum::getDatum()
    {
        std::string back;
        std::stringstream temp;
        temp<<tag<< '.'<<monat<<'.' <<jahr;
    
        //schieben des Stringstreams in den Rückgabe-String
        temp>>back;
        return back;
    };
    
    #endif
    


  • Souljumper schrieb:

    Member b( int id, std::string name, int tg, int mn, int jr);
    

    Auch wenn es vielleicht so aussieht - das da deklariert kein Element vom Typ "Member", sondern eine Funktion, die einen String und insgesamt vier ints nimmt und daraus einen Member konstruieren soll. Richtig sollte das so aussehen:

    Member b(id,name,tg,mn,jr);
    

    (Der Compiler kennt die Typen der Variablen, wenn du sie ihm nochmal extra angibst, verwirrst du ihn nur unnötig)



  • CStoll schrieb:

    Souljumper schrieb:

    Member b( int id, std::string name, int tg, int mn, int jr);
    

    Auch wenn es vielleicht so aussieht - das da deklariert kein Element vom Typ "Member", sondern eine Funktion, die einen String und insgesamt vier ints nimmt und daraus einen Member konstruieren soll. Richtig sollte das so aussehen:

    Member b(id,name,tg,mn,jr);
    

    (Der Compiler kennt die Typen der Variablen, wenn du sie ihm nochmal extra angibst, verwirrst du ihn nur unnötig)

    argh........

    Aber danke 😮


Anmelden zum Antworten