С++: разделение строки на массив

Я пытаюсь вставить строку, разделенную пробелами, в массив строк без использования вектора в C++. Например:

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

Я хочу, чтобы результат был следующим:

test
one
two
three.

Я знаю, что в C++ уже задано множество вопросов, задающих string> array. Я понимаю, что это может быть дублированный вопрос, но я не мог найти ответа, удовлетворяющего моим условиям (разбиение строки на массив без использования вектора). Приносим извинения за продвинутый вопрос, если это повторяющийся вопрос.

Ответ 1

Можно превратить строку в поток, используя класс std::stringstream (его конструктор принимает строку в качестве параметра). После того, как он будет построен, вы можете использовать оператор >> (как в обычных потоковых файлах), который будет извлекать или маркировать слова из него:

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

Ответ 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;
}

Ответ 3

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

Ответ 4

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

Следуйте ссылке

Ответ 5

Вот предложение: используйте два индекса в строке, скажем, start и end. start с первого символа следующей строки для извлечения, end на символ после последнего, принадлежащего следующей строке для извлечения. start начинается с нуля, end получает позицию первого символа после start. Затем вы берете строку между [start..end) и добавляете ее в свой массив. Вы продолжаете идти, пока не попадете в конец строки.