Auf string teile zugreifen

partitionist

Erfahrenes Mitglied
Hallo leute ich empfange beim server ein string, aber dieser string hat mehrere leerzeichen jetzt möchte ich auf jeden einzelnd zugreifen können wie z.b.
Code:
string str = "net send PC hallo"
Hab mir gedacht ob das nicht mit vektoren funktioniert hab auch ein code nur weiß nicht wie man das zusammenbaut

Code:
string str;
istringstream cmdline (str);
        string input;
        vector<string> params;

        if (cmdline >> input) 
        {
            string tmp;
            while (cmdline >> tmp) 
            {
                params.push_back (tmp);
            }
if(params.size() >= 1)
            {
//...
}

Am liebsten würde ich dann so auf str zugreiffen: input == "net", params[0] == "send", params[1] == "PC", params[2] == "hallo"

Bitte dringend um hilfe
 
Du könntest mit string::find() nach leerzeichen suchen und dann per string::substring() oder dem string Konstruktor die einzelnen teile rauskopieren.

ungefähr so
C++:
string s1 = "asd1 asd2";
string::size_type pos = s1.find(" ", 0); // suche das Leerzeichen
string s2(s1, 0, pos); // -> "asd1"
 
Hier mal ein komplettes Beispiel für die Stringzerlegung:
C++:
string str          = "net send PC hallo";
string strDelimiter = " "; // Trennzeichen

// Zerlegung von "str" und Ablage der Teilstrings in "tokens"

vector<string> tokens;
string::size_type nLastPos = str.find_first_not_of(strDelimiter, 0);
string::size_type nPos     = str.find_first_of(strDelimiter, nLastPos);

while( nPos != string::npos || nLastPos != string::npos )
{
    tokens.push_back(str.substr(nLastPos, nPos - nLastPos));

    nLastPos = str.find_first_not_of(strDelimiter, nPos);
    nPos     = str.find_first_of(strDelimiter, nLastPos);
}
Gruß
MCoder
 
partitionist hat gesagt.:
DAnke für die hilfe, @MCoder welcher header muss für token eingebunden werden
Du musst <vector> und <string> includen; "tokens" ist nur der Variablenname für das vector-Objekt, das dann die Teilstrings enthält.
 
Mit tokens[x] greife ich auf jeden einzelnen string zu, doch kann man hierbei ermitteln wieviele tokens übergeben wurden, also in dem obigem beispiel wären das 4 tokens.
 
partitionist hat gesagt.:
kann man hierbei ermitteln wieviele tokens übergeben wurden
Das geht mit den Funktionen der vector-Klasse:
C++:
// Anzahl der Elemente
int nCount = (int)tokens.size();  

// Iteration über alle Elemente
vector<string>::iterator it;
for( it = tokens.begin(); it != tokens.end(); it++ )
{
    string str = *it;

    // ...   
}
Gruß
MCoder
 
MCoder hat gesagt.:
Hier mal ein komplettes Beispiel für die Stringzerlegung:
C++:
string str          = "net send PC hallo";
string strDelimiter = " "; // Trennzeichen

// Zerlegung von "str" und Ablage der Teilstrings in "tokens"

vector<string> tokens;
string::size_type nLastPos = str.find_first_not_of(strDelimiter, 0);
string::size_type nPos     = str.find_first_of(strDelimiter, nLastPos);

while( nPos != string::npos || nLastPos != string::npos )
{
    tokens.push_back(str.substr(nLastPos, nPos - nLastPos));

    nLastPos = str.find_first_not_of(strDelimiter, nPos);
    nPos     = str.find_first_of(strDelimiter, nLastPos);
}
Gruß
MCoder

Nur mal so nebenbei:
C++:
#include <iostream>
#include <sstream>
#include <vector>
#include <iterator>

using namespace std;

int main(){
    istringstream phrase("net send PC hallo");
    string tmp = "";
    vector<string> tokens;
    while(phrase >> tmp)
        tokens.push_back(tmp);
    //output
    copy(tokens.begin(), tokens.end(), ostream_iterator<string>(cout, "\n"));
}

hätte es in dem Fall auch getan ;)

Gruß,
RedWing
 
Zurück