1Danke
ERLEDIGT
JA
JA
ANTWORTEN
14
14
ZUGRIFFE
598
598
EMPFEHLEN
-
08.08.11 11:31 #1Kloppo2011 Tutorials.de Gastzugang
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/2...-a-string-in-c bedient):
Den String und einen einzelnen Trennchar übergeben, raus kommt ein Vektor voll Strings.Code cpp:1 2 3 4 5 6 7 8 9 10 11 12 13 14
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); }
Bei deinem Fall zuerst den Komplettstring mit \n aufteilen, dann die einzelnen Teile nocheinma mit \t.
Zusammenhängen geht dann ja einfach.
Gruß
-
08.08.11 15:11 #3Kloppo2011 Tutorials.de Gastzugang
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:
Code cpp:1 2 3 4 5 6 7 8 9 10 11 12 13
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.
.
Bei der Ausgabe sollte "wert1wert2" herauskommen, ohne Anführungszeichen.Code cpp:1
cout << getwerte("typ1\twert1\ntyp2\twert2\n");
Getestet, Funktioniert.
GrußGeändert von sheel (08.08.11 um 15:35 Uhr) Grund: Kleiner Codefehler: elems statt ret
-
08.08.11 16:05 #5Kloppo2011 Tutorials.de Gastzugang
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 [cpp]...[/cpp].
-
08.08.11 16:16 #7Kloppo2011 Tutorials.de Gastzugang
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");
}
-
08.08.11 16:20 #8
- Registriert seit
- Jun 2005
- Beiträge
- 8.168
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...
GrußIf at first you don't succeed, try again. Then quit. No use being a damn fool about it.
-
08.08.11 16:29 #9Kloppo2011 Tutorials.de Gastzugang
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!
-
09.08.11 10:24 #10Kloppo2011 Tutorials.de Gastzugang
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:
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
-
Nocheinmal: Schreib deinen Code zwischen [cpp]...[/cpp].
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).
Code cpp:1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
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:
würde dir den 7. Eintrag aus einem Array zurückgeben, deines ist aber nur 6 lang.Code cpp:1
return werte[6];
selbes Ding.Code cpp:1
dataout[6] = getwerte(datain);
Wenn du ein Array als Rückgabe für deine Funktion brauchst ist es meist am einfachsten das ganze über Pointer zu lösen:
Code cpp:1 2 3 4
void getwerte(std::string x, std::string* werte) { ... }
Aufruf mit:
Code cpp:1 2
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.Geändert von Steiner_B (09.08.11 um 10:44 Uhr) Grund: Zu langsam.
-
09.08.11 11:17 #13Kloppo2011 Tutorials.de Gastzugang
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 :1 2 3
testtest = CA.labelNode(test); nl = testtest.cstr(); getwerte(nl, werte);
Funktions-Code:
Code :1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
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?
DankeGeändert von Kloppo2011 (09.08.11 um 13:50 Uhr)
-
09.08.11 16:48 #14Kloppo2011 Tutorials.de Gastzugang
Hey,
ich habe eine Lösung gefunden. Vielen Dank für eure Hilfe!
Code :1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23
//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üßeGeändert von Kloppo2011 (10.08.11 um 11:02 Uhr)
-
Bitte die Lösung noch hier posten, vielleicht hat mal wieder wer ein ähnliches Problem.
Ähnliche Themen
-
Polygone zerschneiden
Von bOxer im Forum Cinema 4DAntworten: 2Letzter Beitrag: 08.05.04, 00:46 -
MP3 zerschneiden
Von Receiver im Forum Audiotechnik, Recording & Audio-SoftwareAntworten: 1Letzter Beitrag: 17.03.04, 13:55 -
Objektnamen aus Strings zusammensetzen
Von Calisto im Forum C/C++Antworten: 8Letzter Beitrag: 06.03.02, 09:23 -
Objektnamen aus Strings zusammensetzen
Von Calisto im Forum ASPAntworten: 1Letzter Beitrag: 04.03.02, 10:17 -
[JS] Variablennamen aus Strings zusammensetzen
Von wirfmichweg2 im Forum Javascript & AjaxAntworten: 5Letzter Beitrag: 12.11.01, 13:54





Zitieren

Login






