Strings zerschneiden und zusammensetzen

  • Themenstarter Themenstarter Kloppo2011
  • Beginndatum Beginndatum
Nocheinmal: Schreib deinen Code zwischen [code=cpp]...[/code].
Der Absturz kommt eventuell daher, dass du im main auf dataout[6] zugreifst.
Wenn dataout 6 Elemente hat, sind die [0] [1] [2] [3] [4] und [5].

Wenn du im main sowieso schon ein Array hast, übergib das doch einfach.
Hier noch einmal die ursprüngliche Funktion, die jetzt zusätzlich ein Array nimmt und dieses mitbefüllt (während dem String-zusammenhängen).
C++:
std::string getwerte(std::string x, std::string *y) //Zeile geändert
{
    int yanz = 0; //neue Zeile
    std::string s, ret = "";
    std::stringstream str(x);
    while(std::getline(str, s, '\n')) {
        std::string s2;
        std::stringstream str2(s);
        std::getline(str2, s2, '\t');
        std::getline(str2, s2, '\t');
        ret += s2;
        y[yanz++] = s2; //neue Zeile
    }
    return ret;
}

Übrigens: Ja, du musst mit Zeigern arbeiten. Das tust du, seit du Arrays kennst.

Gruß
 
Hallo,

Bitte schau dir nochmal die Grundlagen im Umgang mit Array an:
C++:
return werte[6];
würde dir den 7. Eintrag aus einem Array zurückgeben, deines ist aber nur 6 lang.

C++:
dataout[6] = getwerte(datain);
selbes Ding.

Wenn du ein Array als Rückgabe für deine Funktion brauchst ist es meist am einfachsten das ganze über Pointer zu lösen:
C++:
void getwerte(std::string x, std::string* werte)
{
   ... 
}

Aufruf mit:
C++:
std::string w[6];
getwerte("...", w);

Die schönere Gesammtlösung ist aber trotzdem die die Sheel in #2 gepostet hat, da du bei dieser Variante nicht wissen musst wieviele Einträge zurückkommen werden.

Und bitte alle Code-Abschnitte zwischen [ cpp] und [ /cpp] (ohne Leerzeichen) stellen.
 
Zuletzt bearbeitet von einem Moderator:
Danke Leute ihr seid großartig! ;-)

Es funktioniert soweit, wenn ich einen String im main hinterlege. Ich möchte jedoch gerne einen String nach dem obigen Format aus einer GML-Datei einlesen (Ist dann vom Typ OGDF::String), denn dann mit Hilfe der Funktion zerschneiden und dann wieder in eine GML-Datei schreiben. Hierfür muss der Typ OGDF::String in einen String umgewandelt werden und nachher wieder zurück.

Wenn ich den String einlese und diesen an die Funktion übergebe, bleibt das Ergebnis dasselbe, also der String wird nicht zerlegt.

Main-Code:
Code:
testtest = CA.labelNode(test);
nl = testtest.cstr();
getwerte(nl, werte);

Funktions-Code:
Code:
std::string getwerte(std::string x, std::string *werte)
{
    std::string s, s2, s3, r=""; 
	std::stringstream str(x);  //Stringstream-Objekt 
	int i = 0; 
		
    while(std::getline(str, s, '\n')) { //extract from, stores extract content, delimination character
        std::stringstream str2(s);
		std::getline(str2, s2, '\t'); //extract from, stores extract content, delimination character
		werte[i++] = s2;
		std::getline(str2, s3, '\t'); //extract from, stores extract content, delimination character (nimmt den Rest auf)
		werte[i++] = s3;
		r += s2; 
	}
	
    return s2;
}

Ergebnis ist dann: name\tMaintain Dialog\ntype\tDL\nalias\tDL_Maintaince_001\n
\n wird nicht als Zeilenumbruch interpretiert, was ja eigentlich auch gut ist.

Generelle Frage:
Berücksichtigt die Funktion in den getline-Zeilen wirklich '\n' bzw. '\t' das ganze oder nur das Zeichen n bzw. t?

Danke
 
Zuletzt bearbeitet von einem Moderator:
Hey,

ich habe eine Lösung gefunden. Vielen Dank für eure Hilfe!

Code:
//Label aufteilen
void split(string data, string deln, string delt, string *werte)
{
     int j =0;                
     for(int i = 0; i <= 2; i++)
	 {
		int pos1 = data.find(delt);
		werte[j++] = data.substr(0, pos1);
		int pos2 = data.find(deln);
		werte[j++] = data.substr((pos1+delt.length()), (pos2 - (pos1+delt.length())));
		data = data.substr(pos2+deln.length(), data.length());
	}
	
}

int main 
{
std::string werte[6];
std::string deln("\\n");
std::string delt("\\t");

split(nodelabel, deln, delt, werte);
}

Grüße
 
Zuletzt bearbeitet von einem Moderator:
Zurück