2017-05-11 84 views
-1

我創建了此代碼以將字符串拆分爲3個不同的字符串str_days,str_column和str_time。我想知道是否有更好的方法將其分成3個變量。可能只使用1條語句?將具有分隔符的字符串拆分爲3個變量

string::size_type pos = combinedString.find(';'); 
if (combinedString.npos != pos) { 
    combined2 = combinedString.substr(pos + 1); 
    str_days = combinedString.substr(0, pos); 
} 
string::size_type pos2 = combined2.find(';'); 
if (combined2.npos != pos2) { 
    str_column = combined2.substr(pos2 + 1); 
    str_time = combined2.substr(0, pos2); 
} 
+1

你試過strtok的? – CIsForCookies

+1

您可以將您的邏輯遷移到單一功能中。 –

+0

@CIsForCookies我看着它,但不知道如何使用它。有很多例子只是把它打印出來,但沒有關於如何分配你分割的每個變量的例子。 –

回答

1

您可以使用std::istringstreamstd::getline(),指定​​3210作爲行分隔符,如:

#include <string> 
#include <sstream> 

std::string combinedString = ...; 
std::string str_days, str_time, str_column; 

std::istringstream iss(combinedString); 
std::getline(iss, str_days, ';'); 
std::getline(iss, str_time, ';'); 
std::getline(iss, str_column); 
+0

要接受這一點,並指出在未來任何人爲了做到這一點,你必須包括: #include #include

1

如果它適合你,你可以用血淋淋的細節後面的可變參數函數:

#include <string> 
#include <algorithm> 

template <typename Iterator, typename Delimiter> 
bool split_into(Iterator begin, Iterator end, Delimiter, std::string & first) 
{ 
    first.assign(begin, end); 
    return true; 
} 

template <typename Iterator, typename Delimiter, typename... Strings> 
bool split_into(Iterator begin, Iterator end, Delimiter d, std::string & first, Strings & ... strings) 
{ 
    auto i = std::find(begin, end, d); 

    first.assign(begin, i); 

    if (i != end) { 
     return split_into(++i, end, d, strings...); 
    } 

    return sizeof...(Strings) == 0; 
} 

然後調用,像這樣:

std::string combinedString("foo;bar;baz;widget"); 
std::string a, b, c; 

split_into(combinedString.begin(), combinedString.end(), ';', a, b, c); 

// a == "foo" 
// b == "bar" 
// c == "baz;widget" 

split_into()將返回false,如果有不遇到足夠的分隔符來填充所有傳遞的參數。

Live demo

相關問題