Potrzebuję utworzyć parser string w C++. Próbowałem za pomocąTokenizer ciągów z wieloma ogranicznikami, w tym ogranicznikiem bez zwiększenia
vector<string> Tokenize(const string& strInput, const string& strDelims)
{
vector<string> vS;
string strOne = strInput;
string delimiters = strDelims;
int startpos = 0;
int pos = strOne.find_first_of(delimiters, startpos);
while (string::npos != pos || string::npos != startpos)
{
if(strOne.substr(startpos, pos - startpos) != "")
vS.push_back(strOne.substr(startpos, pos - startpos));
// if delimiter is a new line (\n) then add new line
if(strOne.substr(pos, 1) == "\n")
vS.push_back("\\n");
// else if the delimiter is not a space
else if (strOne.substr(pos, 1) != " ")
vS.push_back(strOne.substr(pos, 1));
if(string::npos == strOne.find_first_not_of(delimiters, pos))
startpos = strOne.find_first_not_of(delimiters, pos);
else
startpos = pos + 1;
pos = strOne.find_first_of(delimiters, startpos);
}
return vS;
}
Działa to na 2x + 7cos (3Y)
(tokenizer("2X+7cos(3Y)","+-/^() \t");
)
Ale daje błąd wykonania dla 2X
muszę non rozwiązanie impuls.
Próbowałem za pomocą C++ String Toolkit (StrTk) Tokenizer
std::vector<std::string> results;
strtk::split(delimiter, source,
strtk::range_to_type_back_inserter(results),
strtk::tokenize_options::include_all_delimiters);
return results;
ale nie daje znak jako osobny ciąg.
np: jeśli dam wejście jako 2X + 3Y
wyjściowy wektor zawiera
2X +
3Y
Przypuszczalnie trzeba chronić 'pos = str.find_first_of (separatory, lastPos)' od przypadku, gdy 'lastPos' jest' npos'. – ooga
Jeśli zamierzasz wyświetlać kod przy użyciu biblioteki innej niż standardowa (pozornie [to] (http://www.codeproject.com/Articles/23198/C-String-Toolkit-StrTk-Tokenizer), powinieneś nazwać to w pytaniu podaj link i zastanów się nad dodaniem powiązanego tagu do swojego pytania: –
Dodaję, że strtk, ponieważ powiedzenie, że rozwiązanie nie było w stanie rozwiązać mojego problemu. Doda link teraz – user2473015