2012-04-17 33 views
6

Tôi có một chuỗi currentLine = "12 23 45"Tokenize a String in C++

Tôi cần trích xuất 12, 23, 45 từ chuỗi này mà không cần sử dụng thư viện Boost. Kể từ khi tôi đang sử dụng chuỗi, strtok không cho tôi. Tôi đã thử một số thứ vẫn không thành công.

Đây là nỗ lực cuối cùng của tôi

while(!inputFile.eof()) 
    while(getline(inputFile,currentLine)) 
     { 
      int countVar=0; 
      int inputArray[10]; 
      char* tokStr; 
      tokStr=(char*)strtok(currentLine.c_str()," "); 

      while(tokstr!=NULL) 
      { 
      inputArray[countVar]=(int)tokstr; 
      countVar++; 
      tokstr=strtok(NULL," "); 
      } 
     } 
} 

một không strtok

string currentLine; 
while(!inputFile.eof()) 
    while(getline(inputFile,currentLine)) 
     { 
      cout<<atoi(currentLine.c_str())<<" "<<endl; 
      int b=0,c=0; 
      for(int i=1;i<currentLine.length();i++) 
       { 
        bool lockOpen=false; 
        if((currentLine[i]==' ') && (lockOpen==false)) 
         { 
         b=i; 
         lockOpen=true; 
         continue; 
         } 
        if((currentLine[i]==' ') && (lockOpen==true)) 
         { 
         c=i; 
         break; 
         } 
       } 
      cout<<b<<"b is"<<" "<<c;  
     } 
+0

Đó có phải là mã thực sự của bạn, với trường hợp 'không khớp' và 'tokStr' không khớp? Ngoài ra, http://stackoverflow.com/questions/236129/how-to-split-a-string-in-c –

+0

Bạn không báo cáo cách chúng không thành công. Họ có biên dịch không? Họ có gặp sự cố không? Họ có đưa ra kết quả không chính xác không? –

+0

Sử dụng >> toán tử với đối số nguyên. –

Trả lời

9

Hãy thử điều này:

#include <sstream> 

std::string str = "12 34 56"; 
int a,b,c; 

std::istringstream stream(str); 
stream >> a >> b >> c; 

đã đọc rất nhiều về C++ suối ở đây: http://www.cplusplus.com/reference/iostream/

+0

: biến 'std :: istringstream stream' đã khởi tạo nhưng không đầy đủ loại – CodeMonkey

+0

@ user1290495, '#include ' – hmjd

5
std::istringstream istr(your_string); 

std::vector<int> numbers; 
int number; 
while (istr >> number) 
    numbers.push_back(number); 

Hoặc, đơn giản hơn (mặc dù không thực sự ngắn hơn):

std::vector<int> numbers; 
std::copy(
    std::istream_iterator<int>(istr), 
    std::istream_iterator<int>(), 
    std::back_inserter(numbers)); 

(Yêu cầu tiêu đề chuẩn., <algorithm><iterator>)

0

Bạn cũng có thể lựa chọn Boost tokenizer ......

#include <iostream> 
#include <string> 
#include <boost/foreach.hpp> 
#include <boost/tokenizer.hpp> 
using namespace std; 
using namespace boost; 

int main(int argc, char** argv) 
{ 
    string str= "India, gold was dear"; 
    char_separator<char> sep(", "); 
    tokenizer< char_separator<char> > tokens(str, sep); 
    BOOST_FOREACH(string t, tokens) 
    { 
     cout << t << "." << endl; 
    } 
} 
+1

" mà không sử dụng thư viện Boost " – k06a

0

stringstreamboost::tokenizer là hai khả năng. Dưới đây là giải pháp rõ ràng hơn bằng cách sử dụng string::findstring::substr.

std::list<std::string> 
tokenize(
    std::string const& str, 
    char const token[]) 
{ 
    std::list<std::string> results; 
    std::string::size_type j = 0; 
    while (j < str.length()) 
    { 
    std::string::size_type k = str.find(token, j); 
    if (k == std::string::npos) 
     k = str.length(); 

    results.push_back(str.substr(j, k-j)); 
    j = k + 1; 
    } 
    return results; 
} 

Hy vọng điều này sẽ hữu ích. Bạn có thể dễ dàng biến điều này thành một thuật toán viết các thẻ vào các thùng chứa tùy ý hoặc lấy một hàm xử lý xử lý các mã thông báo.