功能我使用是C++分割字符串到矢量<string>
vector<string> tokenise(string s){
}
首先,我打算分割字符串成子,在这种情况下,字符串是总是算术表达式(例如,“100 + 5”)并且可能会有一些空格。
“100 + 5”是需要转换为“100”,“+”,“5”
转换后,子串将被存储在一个矢量并返回它。我正在为第一步奋斗,并使用下标来循环一个字符串。返回的值的类型是char,所以无法将其放入向量中。
功能我使用是C++分割字符串到矢量<string>
vector<string> tokenise(string s){
}
首先,我打算分割字符串成子,在这种情况下,字符串是总是算术表达式(例如,“100 + 5”)并且可能会有一些空格。
“100 + 5”是需要转换为“100”,“+”,“5”
转换后,子串将被存储在一个矢量并返回它。我正在为第一步奋斗,并使用下标来循环一个字符串。返回的值的类型是char,所以无法将其放入向量中。
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;
}
我喜欢你的解决方案,几乎和我的想法一样 –
您提到 - 类型返回的值是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;
这里你可以看到相同的演示
也就是说,或者用'字符串:: substr' –
你已经完全改变了你的问题的答案。现在您需要一些逻辑来确定令牌的结束位置。您可能想要查看像lex或flex这样的lexing工具。 –
对不起,有没有简单的方法来解决这个问题。 –
你可以只调用该字符串的substring
方法,找出那些要么数字字符,算术字符,或范围后不需要。
它不适合我,因为字符串的范围来区分数字和运算符是不确定的。 –
您可以使用'的std :: string STR(1,CH)一个'char'转换为字符串;' –
如果你只用串一个角色,你不妨使用'char' – InternetAussie
@ InternetAussie正如我所问,我必须使用字符串,这使我没有选择。 –