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