2013-10-14 83 views
2

從它的每個值我需要拆分在C++ .字符串..拆分上點串並檢索C++

下面是我的字符串 -

@event.hello.dc1

現在我需要上.拆分上述串並從中檢索@event再通@event於下述方法 -

bool upsert(const char* key);

下面是我從here看完後這麼遠的代碼 -

void splitString() { 

    string sentence = "@event.hello.dc1"; 

    istringstream iss(sentence); 
    copy(istream_iterator<string>(iss), istream_iterator<string>(), ostream_iterator<string>(cout, "\n")); 
} 

但我無法理解如何通過拆分對.使用上述方法,上述方法只能提取@event爲空白......同時也可作爲類似下面如何提取一切從.該字符串的分裂 -

split1 = @event 
split2 = hello 
split3 = dc1 

感謝您的幫助..

+0

http://stackoverflow.com/questions/236129/how-to-split-a-string-in-c – Ashalynd

+0

http://stackoverflow.com/問題/ 5167625/splitti ng-ac-stdstring-using-token-eg – Kunal

回答

8

您可以使用std::getline

string sentence = "@event.hello.dc1"; 
istringstream iss(sentence); 
std::vector<std::string> tokens; 
std::string token; 
while (std::getline(iss, token, '.')) { 
    if (!token.empty()) 
     tokens.push_back(token); 
} 

導致:

tokens[0] == "@event" 
tokens[1] == "hello" 
tokens[2] == "dc1" 
+0

感謝LihO的幫助.. – AKIWEB

-1

可以使用strtok的功能:

strtok(sentence.c_str(), "."); 
+0

你應該提到'strtok'會覆蓋你傳入的字符串,並且你不能傳遞'c_str()'的結果,它是'const char *','strtok',它需要一個非''constst''。 –

0

http://en.cppreference.com/w/cpp/string/byte/strtok 你可以做這樣的事情使用首先,你可以改變什麼是c被認爲是一個流的空間。要做的方法是將新創建的std::locale中的std::ctype<char>方面替換爲此新創建的std::locale中的imbue()。但是,這種方法有點牽涉到了手頭的任務。事實上,以提取由.分隔字符串的第一部分我甚至不會創建流​​:

std::string first_component(std::string const& value) { 
    std::string::size_type pos = value.find('.'); 
    return pos == value.npos? value: value.substr(0, pos); 
} 
1

創建ctype方面是這樣的:

#include <locale> 
#include <vector> 

struct dot_reader: std::ctype<char> { 
    dot_reader(): std::ctype<char>(get_table()) {} 
    static std::ctype_base::mask const* get_table() { 
     static std::vector<std::ctype_base::mask> rc(table_size, std::ctype_base::mask()); 

     rc['.'] = std::ctype_base::space; 
     rc['\n'] = std::ctype_base::space; // probably still want \n as a separator? 
     return &rc[0]; 
    } 
}; 

然後灌輸你的流與它的一個實例,並讀取字符串:

istringstream iss(sentence); 

iss.imbue(locale(locale(), new dot_reader())); // Added this 

copy(istream_iterator<string>(iss), 
    istream_iterator<string>(), 
    ostream_iterator<string>(cout, "\n"));