2013-04-16 16 views
16

Sto cercando di inserire una stringa separata da spazi in una serie di stringhe senza utilizzando il vettore in C++. Per esempio:C++: divisione di una stringa in una matrice

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

voglio l'output di essere:

test 
one 
two 
three. 

So che ci sono già un sacco di domande che chiedono string> array in C++. Mi rendo conto che potrebbe trattarsi di una domanda doppia, ma non sono riuscito a trovare alcuna risposta che soddisfi le mie condizioni (suddividere una stringa in un array SENZA usare il vettore). Mi scuso in anticipo se questa era una domanda ripetuta.

+0

Come procederesti a stampare ogni parola su una riga separata per cominciare? –

+0

usa il substr e trova – 999k

+1

o 'strtok'. . –

risposta

31

È possibile trasformare la stringa in uno stream utilizzando la classe std::stringstream (il suo costruttore prende una stringa come parametro). Una volta che è costruito, è possibile utilizzare l'operatore >> su di esso (come sui flussi regolari basati su file), che sarà estratto, o tokenize parola da esso:

#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

Questa risposta è molto semplice, al punto, e soprattutto funziona! Grazie mille! – txp111030

+0

prego! – didierc

+0

Separa i singoli caratteri per me. – Krii

0

Ecco un suggerimento: utilizzare due indici nella stringa, ad esempio start e end. start punta al primo carattere della stringa successiva da estrarre, end punti al carattere dopo l'ultimo appartenente alla stringa successiva da estrarre. start inizia a zero, end ottiene la posizione del primo carattere dopo start. Quindi prendi la stringa tra [start..end) e aggiungila al tuo array. Continui finché non colpisci la fine della corda.

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' restituisce' string :: npos' se non trova la stringa da cercare e non 0. – RedX

+0

std :: string :: npos è un valore costante membro statico con il massimo valore possibile per un elemento di scrivi size_t.Questa costante è definita con un valore di -1, che poiché size_t è un tipo integrale senza segno, è il più grande valore rappresentabile possibile per questo tipo. –

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

Trivial:

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

Problemi correlati