het splitsen van een string in een array in C++ zonder vector

Ik probeer een tekenreeks te plaatsen die wordt gescheiden door spaties in een reeks snaren zonder met behulp van vector in C++. Bijvoorbeeld:

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

Ik wil dat de uitgang is:

test
one
two
three.

Ik weet dat er al andere vragen zijn die string & gt vragen; Array in C++, maar ik kon geen antwoord vinden die aan mijn voorwaarden voldoet: het splitsen van een string in een array zonder vector te gebruiken.


Antwoord 1, Autoriteit 100%

Het is mogelijk om de touw in een stroom te draaien met behulp van de std::stringstreamklasse (de constructor neemt een string als parameter). Nadat het is gebouwd, kunt u de >>-operator erop gebruiken (zoals op reguliere bestanden gebaseerde streams), die uithaalt, of Tokenize Word van IT:

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

Antwoord 2, Autoriteit 10%

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

Antwoord 3, Autoriteit 5%

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

Antwoord 4

Hier is een suggestie: gebruik twee indices in de tekenreeks, zeg starten end. startverwijst naar het eerste teken van de volgende tekenreeks die moet worden geëxtraheerd, endverwijst naar het teken na het laatste teken dat behoort tot de volgende tekenreeks die moet worden geëxtraheerd. startbegint bij nul, endkrijgt de positie van het eerste teken na start. Dan neem je de string tussen [start..end)en voeg je die toe aan je array. Je gaat door totdat je het einde van de snaar raakt.


Antwoord 5

#include <iostream>
#include <sstream>
#include <vector>
using namespace std;
int main() {
    string s1="split on     whitespace";
    istringstream iss(s1);
    vector<string> result;
    for(string s;iss>>s;)
        result.push_back(s);
    int n=result.size();
    for(int i=0;i<n;i++)
        cout<<result[i]<<endl;
    return 0;
}

Uitvoer:-

split
op
witruimte

Other episodes