web-dev-qa-db-fra.com

C ++: fractionnement d'une chaîne en un tableau

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

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 y a déjà beaucoup de questions demandant chaîne> tableau en C++. Je me rends compte que cela pourrait être une question en double, mais je n'ai trouvé aucune réponse satisfaisant mes conditions (fractionnement d'une chaîne en un tableau SANS utiliser de vecteur). Je m'excuse à l'avance s'il s'agissait d'une question répétée.

18
txp111030

Il est possible de transformer la chaîne en un flux en utilisant std::stringstream classe (son constructeur prend une chaîne en paramètre). Une fois qu'il est construit, vous pouvez utiliser le >> opérateur sur celui-ci (comme sur les flux de fichiers classiques), qui extraira, ou tokenize Word à partir de celui-ci:

#include <iostream>
#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;
    }
}
38
didierc
#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;
}
2
Alexey
#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;
}
2
Vijendra Singh

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

Suivez le lien

1
Petrovich Denis

Voici une suggestion: utilisez deux indices dans la chaîne, dites start et end. start pointe vers le premier caractère de la chaîne suivante à extraire, end pointe vers le 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 ajoutez cela à votre tableau. Vous continuez jusqu'à ce que vous frappiez la fin de la chaîne.

0
Frerich Raabe