2013-04-16 92 views
16

Tôi đang cố gắng chèn một chuỗi được phân tách bằng dấu cách vào một mảng các chuỗi mà không cần sử dụng vectơ trong C++. Ví dụ:C++: tách một chuỗi thành một mảng

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

Tôi muốn đầu ra là:

test 
one 
two 
three. 

Tôi biết đã có rất nhiều câu hỏi hỏi string> mảng trong C++. Tôi nhận ra điều này có thể là một câu hỏi trùng lặp, nhưng tôi không thể tìm thấy bất kỳ câu trả lời thỏa mãn điều kiện của tôi (tách một chuỗi thành một mảng KHÔNG sử dụng vector). Tôi xin lỗi trước nếu đây là một câu hỏi lặp đi lặp lại.

+0

Làm thế nào bạn sẽ đi về việc in mỗi từ trên một dòng riêng biệt để bắt đầu? –

+0

sử dụng chất nền và tìm – 999k

+1

Hoặc 'strtok'. . –

Trả lời

31

Có thể biến chuỗi thành luồng bằng cách sử dụng lớp std::stringstream (hàm tạo của nó lấy một chuỗi làm tham số). Sau khi đã xây dựng, bạn có thể sử dụng >> điều hành trên đó (như trên suối tập tin dựa thường xuyên), nó sẽ phân tách, hoặc tokenize từ từ nó:

#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

Câu trả lời này rất đơn giản, quan trọng, và quan trọng hơn là làm việc! Cảm ơn nhiều! – txp111030

+0

bạn được chào đón! – didierc

+0

Nó chia tách các ký tự riêng lẻ cho tôi. – Krii

0

Đây là đề xuất: sử dụng hai chỉ mục vào chuỗi, giả sử startend. start trỏ đến ký tự đầu tiên của chuỗi tiếp theo để trích xuất, end trỏ đến ký tự sau ký tự cuối cùng thuộc về chuỗi tiếp theo cần trích xuất. start bắt đầu từ số không, end nhận vị trí của char đầu tiên sau start. Sau đó, bạn lấy chuỗi giữa [start..end) và thêm chuỗi đó vào mảng của bạn. Bạn tiếp tục đi cho đến khi bạn nhấn vào cuối chuỗi.

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

'string :: find' trả về' string :: npos' nếu nó không tìm thấy chuỗi được tìm kiếm và không 0. – RedX

+0

std :: string :: npos là một giá trị hằng số thành viên tĩnh có giá trị lớn nhất có thể cho một phần tử của loại size_t.Hằng số này được định nghĩa với giá trị -1, bởi vì size_t là một kiểu tích phân không dấu, nó là giá trị thể hiện lớn nhất có thể cho loại này. –

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

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

Follow link

Các vấn đề liên quan