С++: разделение строки на массив
Я пытаюсь вставить строку, разделенную пробелами, в массив строк без использования вектора в 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)
и добавляете ее в свой массив. Вы продолжаете идти, пока не попадете в конец строки.