2017-05-03 44 views
0

功能我使用是C++分割字符串到矢量<string>

vector<string> tokenise(string s){ 

} 

首先,我打算分割字符串成子,在這種情況下,字符串是總是算術表達式(例如,「100 + 5」)並且可能會有一些空格。

「100 + 5」是需要轉換爲「100」,「+」,「5」

轉換後,子串將被存儲在一個矢量並返回它。我正在爲第一步奮鬥,並使用下標來循環一個字符串。返回的值的類型是char,所以無法將其放入向量中。

+2

您可以使用'的std :: string STR(1,CH)一個'char'轉換爲字符串;' –

+3

如果你只用串一個角色,你不妨使用'char' – InternetAussie

+0

@ InternetAussie正如我所問,我必須使用字符串,這使我沒有選擇。 –

回答

1
vector<string> tokenise(string s) 
{ 
    vector<string> v; 

    string number; 

    for(int i = 0; i < s.length(); ++i) 
    { 
     if((s[i] >= '0') && (s[i] <= '9')) 
     { 
      number += string(1, s[i]); 
     } 
     else if(s[i] == '.') 
     { 
      number += string(1, s[i]); 
     } 
     else if((s[i] == '+') || (s[i] == '-') || (s[i] == '*') || (s[i] == '/')) 
     { 
      if(number.size()) 
      { 
       v.push_back(number); 
       number.clear(); 
      } 
      v.push_back(string(1, c)); 
     } 
    } 

    if(number.size()) 
    { 
     v.push_back(number); 
     number.clear(); 
    } 

    return v; 
} 
+0

我喜歡你的解決方案,幾乎和我的想法一樣 –

1

您提到 - 類型返回的值是char,所以沒有辦法把它的載體。

你有一些函數返回一個字符。然後,您想要將等效的字符串插入向量中。

假設您的矢量定義爲

std::vector<std::string> broken_strings; 

所以,你可以如下做到這一點。

char ch = ...; // Here comes the character that you get from the function. 
std::string str(1, ch); 
broken_strings.push_back(str); 

然後你可以返回broken_strings。

編輯:

OP提到他想標記代數表達式。 所以它必須以不同的方式完成。

下面是一個簡單的方法。

std::vector<std::string> broken; 
std::string temp; 
for (int i = 0; i<s.length() ;i++){ 
    char ch = s[i]; 
    if (ch == ' ') 
     continue; 
    else if (ch >= '0' && ch <='9') 
     temp += ch; 
    else{ 
     if (temp.length() != 0) 
      broken.push_back(temp); 
     temp = ""; 
     temp += ch; 
     broken.push_back(temp); 
     temp = ""; 
    } 
} 
if (temp.length() != 0) 
    broken.push_back(token); 
return broken; 

這裏你可以看到相同的演示

Ideone

+0

也就是說,或者用'字符串:: substr' –

+0

你已經完全改變了你的問題的答案。現在您需要一些邏輯來確定令牌的結束位置。您可能想要查看像lex或flex這樣的lexing工具。 –

+0

對不起,有沒有簡單的方法來解決這個問題。 –

2

你可以只調用該字符串的substring方法,找出那些要麼數字字符,算術字符,或範圍後不需要。

+0

它不適合我,因爲字符串的範圍來區分數字和運算符是不確定的。 –