Anfänger: Array und Funktionsrückgabe



  • hallo,

    könnte mir jemand bei diesme code helfen? Also aufagbe ist es aus dem string die zahlen herauszufiltern, aber es könnten auch verscheidene formate sein zB. TT.MM.JJJJ oder T.M.JJJJ usw.

    #include <iostream>
    #include <stdlib.h>
    #include <string>
    
    using namespace std;
    
    int* kalender(string dtm)
    {
        int *a;
        for(int x=0;x<dtm.size();x++)
    	{
    		if(dtm[x]=='.')
               a = &x; 
        }
        return a;    
    }
    
    int main()
    {
    	string datum = "06.07.08";
    	string tag ="";
    	string monat ="";
    	string jahr="";
    	int start = 0;
    	int *p_p; //PUNKTE-POSITION
    
        p_p = kalender(datum);
    
        tag = datum.substr(start,p_p[1]);
        start += p_p[1]+2;
    
        monat = datum.substr(start,p_p[2]);
        start += p_p[1]+2;
    
        jahr = datum.substr(start,p_p[3]);
    
         cout<<tag<<endl;;
         cout<<monat<<endl;
         cout<<jahr<<endl;
    
      system("PAUSE");
      return 0;
    }
    


  • Achso und mein problem ist, dass iwie das fesnter sofirt wieder zugeht nachdem ich kompiliert und ausgeführt habe.

    es scheint iwie nen problem mit der adressierung etc zu geben...



  • merchant schrieb:

    Achso und mein problem ist, dass iwie das fesnter sofirt wieder zugeht nachdem ich kompiliert und ausgeführt habe.

    es scheint iwie nen problem mit der adressierung etc zu geben...

    Versuch mal statt [] die Funktion at()
    Dann wirst du den Fehler vielleicht sogar selber finden.
    (Tipp: start ist zu weit hinten )



  • merchant-killer schrieb:

    merchant schrieb:

    Achso und mein problem ist, dass iwie das fesnter sofirt wieder zugeht nachdem ich kompiliert und ausgeführt habe.

    es scheint iwie nen problem mit der adressierung etc zu geben...

    Versuch mal statt [] die Funktion at()
    Dann wirst du den Fehler vielleicht sogar selber finden.
    (Tipp: start ist zu weit hinten )

    Wat laberst du? 😕

    @Topic:
    int *p_p; //PUNKTE-POSITION Ist absoluter Unsinn! Was provozierst undefiniertes Verhalten. Dein Zeiger p_p zeigt auf nichts, also ist p_p[1] undefiniert.
    Gebe zahlen ein:
    datum.substr(0,1);
    datum.substr(3,4);
    datum.substr(6,7);



  • merchant-killer-killer schrieb:

    int *p_p; //PUNKTE-POSITION Ist absoluter Unsinn! Was provozierst undefiniertes Verhalten. Dein Zeiger p_p zeigt auf nichts, also ist p_p[1] undefiniert.

    Du hast aber deinen Kaffee auch noch nicht getrunken, heh? 🙄

    in der Funktion kalender musst du wenn schon überhaupt int* a = new int[2];
    machen. Dennoch weiß ich nicht warum du das in einem array zwuschenspeichern willst. std::string bietet genug möglichkeiten um die Punkte zu finden.
    Zu a=&x;
    x ist eine lokale variable in kalender(string); weshalb auch der Zeiger p_p ungültig wird, da x nach Ende von kalender nicht mehr existiert!



  • Also ich würde auch ein int array verwenden (Da ja nur 2 . erwünscht sind). So ist es wohl recht bequem und man kann fehler gut abfangen. (Jedoch mit Sicherheit kein dynamisches array!)
    Schau dir doch mal string::find an:
    http://www.cppreference.com/wiki/string/find

    Dort kannst du den nächsten Punkt suchen, wenn du angibst, ab wo du suchen willst (eben nach dem lezten gefundenen Punkt. Alles klar?
    Ich würde es so machen:
    Nach Punkten suchen und Positionen in int p[2] speichern.
    Falls mehr als array voll + punkt gefunden -> zu viele Punkte: fehler
    mit substring so machen:
    datum.substr(0,p[0]);
    datum.substr(p[0],p[1]);
    datum.substr(p[1]);
    Schau dir auch für substr die referenz an:

    http://www.cppreference.com/wiki/string/substr

    Wenn du das array in der Funktion kalender füllen willst, dann würde ich das array als argument übergeben, nicht rückgabetyp:

    bool kalender(int* )
    {
      //Fülle array und gebe zurück ob alles ok (genau 2 punkte gefunden)
    }
    
    int main() {
    int p[2];
    kalender(p);
    }
    


  • merchant schrieb:

    #include <iostream>
    #include <stdlib.h>
    #include <string>
    
    using namespace std;
    
    int* kalender(string dtm)
    {
        int *a;
        for(int x=0;x<dtm.size();x++)
    	{
    		if(dtm[x]=='.')
               a = &x; 
        }
    

    Der Inhalt von a ist an dieser Stelle wertlos, da a entweder nicht initialisiert wurde oder auf eine jetzt nicht mehr existierende Variable x zeigt.

    return a;    
    }
    
    int main()
    {
    	string datum = "06.07.08";
    	string tag ="";
    	string monat ="";
    	string jahr="";
    	int start = 0;
    	int *p_p; //PUNKTE-POSITION
    
        p_p = kalender(datum);
    

    Der Inhalt von p_p ist Müll.

    tag = datum.substr(start,p_p[1]);
        start += p_p[1]+2;
    

    Undefiniertes Verhalten (Zeigerarithmetik mit ungültigem Zeiger + Dereferenzieren)

    monat = datum.substr(start,p_p[2]);
        start += p_p[1]+2;
    

    Undefiniertes Verhalten

    jahr = datum.substr(start,p_p[3]);
    

    Undefiniertes Verhalten

    Probier's mal hiermit:

    #include <iostream>
    #include <stdexcept>
    #include <utility>
    
    using namespace std;
    
    /**
     * findet zwei Punkte im String oder wirft eine Ausnahme, falls 
     * es weniger oder mehr Punkte gibt.
     */
    pair<int,int> zwei_punkte(string const& s)
    {
    	size_t pos[3];
    	size_t next = 0;
    	for (int k=0; k<3; ++k) {
    		size_t temp = s.find('.',next);
    		if ((k==2) ^ (temp==string::npos))
    			throw runtime_error("format error");
    		pos[k] = temp;
    		next = temp+1;
    	}
    	return pair<int,int>(pos[0],pos[1]);
    }
    

    Gruß,
    SP


Anmelden zum Antworten