tutorials.de Buch-Aktion 05/2012
Like Tree1Danke
  • 1 Beitrag von sheel
ERLEDIGT
JA
ANTWORTEN
14
ZUGRIFFE
598
EMPFEHLEN
  • An Twitter übertragen
  • An Facebook übertragen
AUF DIESES THEMA
ANTWORTEN
  1. #1
    Kloppo2011 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.
     

  2. #2
    Avatar von sheel
    sheel sheel ist offline Moderator
    tutorials.de Moderator
    Registriert seit
    Jul 2007
    Beiträge
    4.501
    Hi und Willkommen bei tutorials.de

    Zum splitten generell (hab mich bei http://stackoverflow.com/questions/2...-a-string-in-c bedient):
    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);
    }
    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ß
     

  3. #3
    Kloppo2011 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
     

  4. #4
    Avatar von sheel
    sheel sheel ist offline Moderator
    tutorials.de Moderator
    Registriert seit
    Jul 2007
    Beiträge
    4.501
    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.
    .
    Code cpp:
    1
    
    cout << getwerte("typ1\twert1\ntyp2\twert2\n");
    Bei der Ausgabe sollte "wert1wert2" herauskommen, ohne Anführungszeichen.
    Getestet, Funktioniert.

    Gruß
    Geändert von sheel (08.08.11 um 15:35 Uhr) Grund: Kleiner Codefehler: elems statt ret
     

  5. #5
    Kloppo2011 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
     

  6. #6
    Avatar von sheel
    sheel sheel ist offline Moderator
    tutorials.de Moderator
    Registriert seit
    Jul 2007
    Beiträge
    4.501
    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].
     

  7. #7
    Kloppo2011 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");
    }
     

  8. #8
    deepthroat deepthroat ist offline Mitglied Diamant
    tutorials.de Premium-User
    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.

  9. #9
    Kloppo2011 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!
     

  10. #10
    Kloppo2011 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
     

  11. #11
    Avatar von sheel
    sheel sheel ist offline Moderator
    tutorials.de Moderator
    Registriert seit
    Jul 2007
    Beiträge
    4.501
    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ß
    Kloppo2011 bedankt sich. 

  12. #12
    Steiner_B Steiner_B ist offline Mitglied Platin
    Registriert seit
    Mar 2004
    Ort
    Wien
    Beiträge
    573
    Hallo,

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

    Code cpp:
    1
    
    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:
    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.
     

  13. #13
    Kloppo2011 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?

    Danke
    Geändert von Kloppo2011 (09.08.11 um 13:50 Uhr)
     

  14. #14
    Kloppo2011 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üße
    Geändert von Kloppo2011 (10.08.11 um 11:02 Uhr)
     

  15. #15
    Steiner_B Steiner_B ist offline Mitglied Platin
    Registriert seit
    Mar 2004
    Ort
    Wien
    Beiträge
    573
    Bitte die Lösung noch hier posten, vielleicht hat mal wieder wer ein ähnliches Problem.
     

Ähnliche Themen

  1. Polygone zerschneiden
    Von bOxer im Forum Cinema 4D
    Antworten: 2
    Letzter Beitrag: 08.05.04, 00:46
  2. MP3 zerschneiden
    Von Receiver im Forum Audiotechnik, Recording & Audio-Software
    Antworten: 1
    Letzter Beitrag: 17.03.04, 13:55
  3. Objektnamen aus Strings zusammensetzen
    Von Calisto im Forum C/C++
    Antworten: 8
    Letzter Beitrag: 06.03.02, 09:23
  4. Objektnamen aus Strings zusammensetzen
    Von Calisto im Forum ASP
    Antworten: 1
    Letzter Beitrag: 04.03.02, 10:17
  5. [JS] Variablennamen aus Strings zusammensetzen
    Von wirfmichweg2 im Forum Javascript & Ajax
    Antworten: 5
    Letzter Beitrag: 12.11.01, 13:54