web-dev-qa-db-ja.com

C ++:文字列を配列に分割する

C++でvectorを使用して、スペースで区切られた文字列を文字列の配列に挿入しようとしていますwithout。例えば:

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を尋ねる質問がすでにたくさんあることは知っています。これは重複した質問かもしれませんが、条件を満たしている回答を見つけることができませんでした(ベクトルを使用せずに文字列を配列に分割する)。これが繰り返し質問された場合は、事前に謝罪します。

18
txp111030

std::stringstream クラスを使用すると、文字列をストリームに変換できます(コンストラクターはパラメーターとして文字列を受け取ります)。ビルドしたら、(通常のファイルベースのストリームのように)>>演算子を使用して、抽出、またはtokenizeWordを使用できます。それから:

#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

簡易:

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

フォローリンク

1
Petrovich Denis

提案は次のとおりです。文字列に2つのインデックスを使用します。たとえば、startendです。 startは、抽出する次の文字列の最初の文字を指し、endは、抽出する次の文字列に属する最後の文字の後の文字を指します。 startはゼロから始まり、endstartの後の最初の文字の位置を取得します。次に、[start..end)の間の文字列を取得して、配列に追加します。文字列の最後に達するまで続けます。

0
Frerich Raabe