2013-04-16 6 views
16

J'essaie d'insérer une chaîne séparée par des espaces dans un tableau de chaînes sans en utilisant un vecteur en C++. Par exemple:C++: scinder une chaîne en un tableau

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

Je veux que la sortie soit:

test 
one 
two 
three. 

Je sais qu'il ya déjà beaucoup de questions demandant chaîne> array en C++. Je me rends compte que ceci pourrait être une question en double, mais je n'ai pas trouvé de réponse satisfaisant mes conditions (séparer une chaîne en un tableau SANS utiliser un vecteur). Je m'excuse à l'avance si c'était une question répétée.

+0

Comment voulez-vous imprimer chaque mot sur une ligne distincte pour commencer? –

+0

utiliser substr et trouver – 999k

+1

Ou 'strtok'. . –

Répondre

31

Il est possible de transformer la chaîne en flux en utilisant la classe std::stringstream (son constructeur prend une chaîne en paramètre). Une fois qu'il est construit, vous pouvez utiliser l'opérateur >> sur elle (comme sur les flux basés sur des fichiers réguliers), qui extraira ou tokenize mot de lui:

#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

Cette réponse est très simple, au point, et surtout fonctionne! Merci beaucoup! – txp111030

+0

vous êtes les bienvenus! – didierc

+0

Il sépare les caractères individuels pour moi. – Krii

0

Voici une suggestion: utilisez deux indices dans la chaîne, par exemple start et end. start points au premier caractère de la chaîne suivante à extraire, end points au caractère après le dernier appartenant à la chaîne suivante à extraire. start commence à zéro, end obtient la position du premier caractère après start. Ensuite, vous prenez la chaîne entre [start..end) et l'ajouter à votre tableau. Vous continuez jusqu'à ce que vous atteigniez la fin de la chaîne.

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' renvoie' string :: npos' s'il n'a pas trouvé la chaîne recherchée et non 0. – RedX

+0

std :: string :: npos est une valeur constante de membre statique avec la plus grande valeur possible pour un élément de tapez size_t.Cette constante est définie avec une valeur de -1, car size_t étant un type intégral non signé, c'est la plus grande valeur représentable possible pour ce type. –

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

Questions connexes