Ein String in mehrere Teile zerlegen, doch es funktioniert nicht richtig?!



  • Guten Tag,
    ich habe ein Code mit einer Klasse in Visual C++ Express geschrieben in der ich mehrere Eingaben in ein Feld eines Arrays speichern kann, das ganze Programm läuft gut jedoch habe ich ein Problem bei der Ausgabe und hoffe mir kann jemand helfen:

    void Telefonbuch::neueTeilnehmer(string name, string vorname, string telefonnr)
    {
    	telefonnr = name + ',' + vorname + ':' + telefonnr;	//Addieren und Zusammenführen der 3 Strings auf 1 Feld
    	this->Teilnehmer[this->anzahl] = telefonnr;		//Ablegen des Strings auf ein Feld im Array
    	this->anzahl++;		//Hochzählen der Einträge
    }
    
    void Telefonbuch::ausgeben()
    {
    	if (this->anzahl != 0)	//Abfrage auf vorhandene Eingaben
    	{
    		cout.width(45);		//width bewirkt das eingefügte Daten in einer Breite von 40 Zeichen ausgegeben werden
    		cout.setf(ios::left);	//Ausrichtung der Daten ist linksbündig
    		cout << "\n\tTELEFONBUCH" << "\nNr.\t" << setw(12) << "Name" << setw(13) << "Vorname" << setw(16) << "Telefonnummer\n" << endl;
    		cout.unsetf(ios::left);	//Aufhebung der Ausrichtung
    		for (int a=0; a < this->anzahl; a++)
    		{
    			//size_type ist ein Zahlentyp, der groß genug für die maximale Anzahl an Elementen ist. 
    			string::size_type position1 = this->Teilnehmer[a].find(',');	//String wird nach Zeichen "," durchsucht(find = string von vorne durchsuchen)
    			cout << setw(2) << setfill('0') << a+1 << ".\t" << flush;
    			cout << setw(12) << setfill(' ') << setiosflags(ios::left) << this->Teilnehmer[a].substr(0, position1) << flush;
    			string::size_type position2 = this->Teilnehmer[a].find(':');	//String wird nach Zeichen ":" durchsucht(find = string von hinten durchsuchen)
    			cout << setw(13) << this->Teilnehmer[a].substr(position1+1, position2) << flush;
    			cout << setw(16) << this->Teilnehmer[a].substr(position2+1) << resetiosflags(ios::left) << endl;
    		}
    	}
    }
    

    Das Problem bei diesem Code liegt darin das die Ausgabe mir das anzeigt:

    TELEFONBUCH
    Nr.    Name         Vorname  Telefonnummer
    01.    Mustermann   Max:123456123456
    

    Wieso macht der die Telnr doppelt anstatt wie in der Methode beschrieben die durch die Trennzeichen zu trennen?
    Was könnte ich machen um es zu korrigieren bzw. was mache ich falsch?

    Ich hoffe mir kann einer helfen, und danke schonmal im Vorfeld.

    Grüße



  • Wieso missbrauchst du std::string um mehrere Werte zu speichern? Schreib doch einfach eine eigene Klasse dafür.

    struct contact_data {
      std::string name, vorname, telefonnr;
    };
    std::vector<contact_data> teilnehmer;
    


  • He, das wollte ich gerade sagen! 😉



  • Hallo Rickytop,

    dein Aufruf

    substr(position1+1, position2)
    

    erzeugt die entsprechende Ausgabe, denn der 2. Parameter gibt die Länge an (nicht den absoluten Index).
    Probiere mal

    substr(position1+1, position2-position)
    

    Aber die Bemerkungen bzgl. eigener Struktur/Klasse solltest du trotzdem umsetzen.



  • Danke Th69, das war der Fehler. Super Tipp!

    Das Problem bei meinem Programm ist dieser, das ich keine Eigene Klasse für die Daten benutzen darf.Ich sollte eine Klasse erstellen in dieser die genannten Funktionen und ein Array Teilnehmer existiert worin die Daten gespeichert werden, darum nutze ich string um mehrere Sachen darin zu speichern 😉



  • Dann erstellst du in der Klasse halt eine weiter Struktur...



  • Rickytop schrieb:

    Ein String in mehrere Teile zerlegen, doch es funktioniert nicht richtig?!

    Richtig wäre:
    Einen String in mehrere Teile zerlegen, doch es funktioniert nicht richtig?!
    Wen oder was in mehrere Teile zerlegen? Einen String.
    http://de.wikipedia.org/wiki/Akkusativ



  • deutschlehr0r schrieb:

    Rickytop schrieb:

    Ein String in mehrere Teile zerlegen, doch es funktioniert nicht richtig?!

    Richtig wäre:
    Einen String in mehrere Teile zerlegen, doch es funktioniert nicht richtig?!
    Wen oder was in mehrere Teile zerlegen? Einen String.
    http://de.wikipedia.org/wiki/Akkusativ

    KLUGSCHEISSER!

    @Nathan:
    Wozu sollte ich das umschreiben, wenn das Programm einwandfrei läuft?
    Sehe keinen Vorteil darin es zu erweitern?!



  • Rickytop schrieb:

    Wozu sollte ich das umschreiben, wenn das Programm einwandfrei läuft?
    Sehe keinen Vorteil darin es zu erweitern?!

    Am Anfang deines Weges ist Perfektionismus dein Freund.



  • ...


Anmelden zum Antworten