功能我使用是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正如我所問,我必須使用字符串,這使我沒有選擇。 –