2013-04-16 16 views
16

Próbuję wstawić łańcuch oddzielony spacjami do tablicy ciągów bez używając wektora w C++. Na przykład:C++: podział ciągu znaków na tablicę

using namespace std; 
int main() { 
    string line = "test one two three."; 
    string arr[4]; 

    //codes here to put each word in string line into string array arr 
    for(int i = 0; i < 4; i++) { 
     cout << arr[i] << endl; 
    } 
} 

Chcę wyjście będzie:

test 
one 
two 
three. 

Wiem, że istnieje już wiele pytań z prośbą string> tablicę w C++. Rozumiem, że to może być duplikat pytania, ale nie mogłem znaleźć odpowiedzi spełniającej moje warunki (dzielenie łańcucha na tablicę BEZ używania wektora). Przepraszam za wysoko, jeśli to było powtarzające się pytanie.

+0

W jaki sposób chcesz wydrukować każde słowo w osobnej linii na początek? –

+0

użyj substr i znajdź – 999k

+1

Lub 'strtok'. . –

Odpowiedz

31

Możliwe jest przekształcenie łańcucha znaków w strumień przy użyciu klasy std::stringstream (jego konstruktor przyjmuje ciąg znaków jako parametr). Raz jest zbudowany, można użyć operatora >> na nim (jak na regularnych strumieni oparciu plik), który rozpakuje lub tokenize słowo od niego:

#include <sstream> 

using namespace std; 

int main(){ 
    string line = "test one two three."; 
    string arr[4]; 
    int i = 0; 
    stringstream ssin(line); 
    while (ssin.good() && i < 4){ 
     ssin >> arr[i]; 
     ++i; 
    } 
    for(i = 0; i < 4; i++){ 
     cout << arr[i] << endl; 
    } 
} 
+2

Ta odpowiedź jest bardzo prosta, na temat, a co ważniejsze działa! Dziękuję Ci bardzo! – txp111030

+0

nie ma za co! – didierc

+0

Dzieli mi poszczególne postacie. – Krii

0

Oto sugestia: użyj dwóch indeksów w ciągu, powiedzmy start i end. start wskazuje na pierwszą literę następnego ciągu do wyodrębnienia, end wskazuje na znak po ostatnim należącym do następnego ciągu do wyodrębnienia. start rozpoczyna się od zera, end otrzymuje pozycję pierwszego znaku po start. Następnie weź ciąg pomiędzy [start..end) i dodaj go do swojej tablicy. Idź dalej, aż uderzysz końca struny.

2
#define MAXSPACE 25 

string line = "test one two three."; 
string arr[MAXSPACE]; 
string search = " "; 
int spacePos; 
int currPos = 0; 
int k = 0; 
int prevPos = 0; 

do 
{ 

    spacePos = line.find(search,currPos); 

    if(spacePos >= 0) 
    { 

     currPos = spacePos; 
     arr[k] = line.substr(prevPos, currPos - prevPos); 
     currPos++; 
     prevPos = currPos; 
     k++; 
    } 


}while(spacePos >= 0); 

arr[k] = line.substr(prevPos,line.length()); 

for(int i = 0; i < k; i++) 
{ 
    cout << arr[i] << endl; 
} 
+0

'string :: find' zwraca' string :: npos', jeśli nie znalazł szukanego ciągu, a nie 0. – RedX

+0

std :: string :: npos to stała wartość składowa stałej z największą możliwą wartością dla elementu wpisz size_t.Stała ta jest definiowana z wartością -1, która ponieważ size_t jest typem całkowitym bez znaku, jest to największa możliwa do przedstawienia wartość dla tego typu. –

2
#include <iostream> 
#include <sstream> 
#include <iterator> 
#include <string> 

using namespace std; 

template <size_t N> 
void splitString(string (&arr)[N], string str) 
{ 
    int n = 0; 
    istringstream iss(str); 
    for (auto it = istream_iterator<string>(iss); it != istream_iterator<string>() && n < N; ++it, ++n) 
     arr[n] = *it; 
} 

int main() 
{ 
    string line = "test one two three."; 
    string arr[4]; 

    splitString(arr, line); 

    for (int i = 0; i < 4; i++) 
     cout << arr[i] << endl; 
} 
1

trywialne:

const vector<string> explode(const string& s, const char& c) 
{ 
    string buff{""}; 
    vector<string> v; 

    for(auto n:s) 
    { 
     if(n != c) buff+=n; else 
     if(n == c && buff != "") { v.push_back(buff); buff = ""; } 
    } 
    if(buff != "") v.push_back(buff); 

    return v; 
} 

Follow link

Powiązane problemy