Strings zerschneiden und zusammensetzen

  • Themenstarter Themenstarter Kloppo2011
  • Beginndatum Beginndatum
K

Kloppo2011

Hey Leute,

helft mir doch mal bitte bei folgendem Problem. Ich programmiere mit C++ Visual Studio 2010 und schreibe eine Consolen-Anwendung.

Ich möchte mehrere Strings nach folgendem Muster zerlegen und zusammensetzen:
"typ1\tWert1\ntyp2\tWert2\ntyp3\tWert3\n"
Nun möchte ich sechs Strings mit diesen Werten haben:
String1 = typ1
String2 = typ2
String3 = typ3
String4 = Wert1
String5 = Wert2
String6 = Wert3

Und folgendermaßen soll der String, je nach gewählter Reihenfolge wieder zusammengesetzt werden:
Ergenis = Wert1 + Wert2 + Wert3

Danke für Eure Hilfe.
 
Hi und Willkommen bei tutorials.de :)

Zum splitten generell (hab mich bei http://stackoverflow.com/questions/236129/how-to-split-a-string-in-c bedient):
C++:
std::vector<std::string> &split(const std::string &s, char delim, std::vector<std::string> &elems) {
    std::stringstream ss(s);
    std::string item;
    while(std::getline(ss, item, delim)) {
        elems.push_back(item);
    }
    return elems;
}


std::vector<std::string> split(const std::string &s, char delim) {
    std::vector<std::string> elems;
    return split(s, delim, elems);
}
Den String und einen einzelnen Trennchar übergeben, raus kommt ein Vektor voll Strings.

Bei deinem Fall zuerst den Komplettstring mit \n aufteilen, dann die einzelnen Teile nocheinma mit \t.
Zusammenhängen geht dann ja einfach.

Gruß
 
Hey,

danke für die Antwort, aber ich stehe auf dem Schlauch! Kannst du mir das noch etwas genauer erklären? Acuh was ich einbinden muss und wie ich was aufrufen muss und wie ich auch die Elemente des Vektors zugreife?

Danke
 
Den Code kopierst du einfach irgendwo zwischen die includes und main:
C++:
std::string getwerte(std::string x)
{
    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;
    }
    return ret;
}

Um dann deinen zusammengesetzten Wert1+Wert2+...-String zu erhalten rufst du einfach getwerte auf und übergibst den String.
.
C++:
cout << getwerte("typ1\twert1\ntyp2\twert2\n");
Bei der Ausgabe sollte "wert1wert2" herauskommen, ohne Anführungszeichen.
Getestet, Funktioniert.

Gruß
 
Zuletzt bearbeitet:
Vielen Dank,

irgendwie nicht meine Welt:
std::stringstream str(x); Hier wird angemeckert, dass "ein unvollständiger typ ist nicht zulässig"

Danke
 
Compiler (mit Version)?
Welche includes und usings drinnen?
Wenn das Programm nicht zu lang ist, kannst du es ja einmal komplett reinstellen. Mit allen includes etc.
Bitte zwischen [code=cpp]...[/code].
 
Ich nutze Visual Studio 2010 C++!
#include "stdafx.h"
#include <iostream>
#include <string>
#include <string.h>
#include <stdlib.h>
#include <windows.h>

using namespace std;

std::string getwerte(std::string x)
{
std::string s, ret = "";
std::stringstream str();

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;
}
return ret;
}

int main () {
cout << getwerte("name\tMaintain Dialog\ntype\tDL\nalias\tDL_Maintaince_001\n");
}
 
Hi.

Für stringstream mußt du sstream include'n. Steht in jeder guten Referenz und eine Suche von paar Sekunden hätte das ans Licht gebracht... :suchen:

Gruß
 
Danke deepthroat! Ist halt kurz vor Feierabend!! ;-)

Vielen Dank für die Lösung und die schnelle Hilfe sheel****** DANKE hast mir sehr weitergeholfen!! Meine eigene Lösung war nicht so komfortabel!
 
Guten Morgen,

jetzt muss ich die Werte halt nur noch in einzelne Variablen oder in ein Array speichern und nicht in einen langen String. Ich habe soweit ein Array[6] angelegt und mit den Werten in der Funktion gefüllt.
Mein Code:
Code:
std::string getwerte(std::string x)
{
    std::string s, s2, s3, ret = ""; 
	//std::string s2;
    std::stringstream str(x);  //Stringstream-Objekt 'werte'
	std::string werte[6];
	int i = 0; 
		
    while(std::getline(str, s, '\n')) { //extract from, stores extract content, delimination character
        //cout << s <<endl; 
		std::stringstream str2(s);
		std::getline(str2, s2, '\t'); //extract from, stores extract content, delimination character
		//cout << s2 <<endl;
		werte[i] = s2;
		i++;
        std::getline(str2, s3, '\t'); //extract from, stores extract content, delimination character (nimmt den Rest auf)
		//cout << s3 <<endl; 
		werte[i] = s3;
		ret += s2;
		i++;
	}
	
    return werte[6];
}

? Geht es eleganter und wie gebe ich das Array ans Main zurück? Mein Funktionsaufruf lautet:
dataout[6] = getwerte(datain); Dabei stürzt das Programm aber ab. Muss ich mit Zeigern arbeiten?

Danke
 
Zurück