2011-12-09 49 views
11

thể trùng lặp:
How to split a string in C++?chia một chuỗi thành một mảng trong C++

Tôi có một tập tin đầu vào của dữ liệu và mỗi dòng là một mục. trong mỗi dòng, mỗi "trường" được phân cách bởi một khoảng trắng "" vì vậy tôi cần phải chia dòng theo không gian. các ngôn ngữ khác có một chức năng được gọi là tách (C#, PHP vv) nhưng tôi không thể tìm thấy một cho C + +. Làm thế nào tôi có thể đạt được điều này? Đây là mã của tôi nhận được các dòng:

string line; 
ifstream in(file); 

while(getline(in, line)){ 

    // Here I would like to split each line and put them into an array 

} 

Trả lời

20
#include <sstream> //for std::istringstream 
#include <iterator> //for std::istream_iterator 
#include <vector> //for std::vector 

while(std::getline(in, line)) 
{ 
    std::istringstream ss(line); 
    std::istream_iterator<std::string> begin(ss), end; 

    //putting all the tokens in the vector 
    std::vector<std::string> arrayTokens(begin, end); 

    //arrayTokens is containing all the tokens - use it! 
} 

Bằng cách này, sử dụng có trình độ-tên như std::getline, std::ifstream như tôi đã làm. Có vẻ như bạn đã viết using namespace std một nơi nào đó trong mã của mình được coi là thực hành không tốt. Vì vậy, không làm điều đó:

+0

Bạn có thể cung cấp một liên kết đến một cuộc thảo luận về lý do tại sao việc sử dụng không gian tên x' là một hành vi không tốt? – jli

+0

@jli: Đã thêm liên kết vào câu trả lời của tôi. Nhìn thấy nó. – Nawaz

+2

@Nawaz cảm ơn, Nhìn vào các câu hỏi khác của tôi, cú pháp tôi đang sử dụng và cách tôi đang học C++ từ giảng viên của tôi tại uni là rất có vấn đề: S !!!!! –

0

Hoặc sử dụng một stringstream hoặc đọc mã thông báo là thẻ từ ifstream của bạn.

Để làm điều đó với một stringstream:

string line, token; 
ifstream in(file); 

while(getline(in, line)) 
{ 
    stringstream s(line); 
    while (s >> token) 
    { 
     // save token to your array by value 
    } 
} 
+0

Tất nhiên bạn có thể sử dụng tăng nếu bạn muốn, hoặc một chức năng STL khác để thực hiện sao chép ra khỏi chuỗi. – jli

+0

Nếu đầu vào kết thúc trong khoảng trắng, vòng lặp while trong này sẽ tạo thêm một mã thông báo trống ở cuối. Thành ngữ C++ 'trong khi (s >> token)' thì không. – Cubbi

+0

Điều này đúng. Cũng có thể chỉnh sửa để sử dụng phương pháp đó. – jli

3

Hãy thử strtok. Hãy tìm nó trong tài liệu tham khảo C++ :.

+3

'strtok' là một điều C thư viện, trong khi người đăng ký yêu cầu làm thế nào để làm điều đó một cách chính xác với C++. – jli

+2

và C++ không phải là c? (... OMG tất cả những năm họ đều nói dối tôi: D). Kể từ khi thư viện c đã ngừng làm việc trong c + + (hoặc biến không chính xác)? – LucianMLI

+0

Nếu bạn trộn chúng, bạn thêm phụ thuộc không cần thiết, trong số các vấn đề khác. – jli

3

Tôi đã viết một hàm cho yêu cầu mô phỏng của tôi. có thể là u có thể sử dụng nó!

std::vector<std::string> &split(const std::string &s, char delim, std::vector<std::string> &elems) 
{ 
    std::stringstream ss(s+' '); 
    std::string item; 
    while(std::getline(ss, item, delim)) 
    { 
     elems.push_back(item); 
    } 
    return elems; 
} 
1

Mã dưới đây sử dụng strtok() để chia chuỗi thành thẻ và lưu trữ mã thông báo trong vectơ.

#include <iostream> 
#include <algorithm> 
#include <vector> 
#include <string> 

using namespace std; 


char one_line_string[] = "hello hi how are you nice weather we are having ok then bye"; 
char seps[] = " ,\t\n"; 
char *token; 



int main() 
{ 
    vector<string> vec_String_Lines; 
    token = strtok(one_line_string, seps); 

    cout << "Extracting and storing data in a vector..\n\n\n"; 

    while(token != NULL) 
    { 
     vec_String_Lines.push_back(token); 
     token = strtok(NULL, seps); 
    } 
    cout << "Displaying end result in vector line storage..\n\n"; 

    for (int i = 0; i < vec_String_Lines.size(); ++i) 
    cout << vec_String_Lines[i] << "\n"; 
    cout << "\n\n\n"; 


return 0; 
} 
Các vấn đề liên quan