2017-05-03 45 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

它不适合我,因为字符串的范围来区分数字和运算符是不确定的。 –