我正在尝试用C ++将字符串分解成“符号”以便进一步完成工作。我已经很长时间没有用C ++编写任何东西了,所以如果这段代码存在内在的错误,请原谅我。
以下symbolize()
函数的目的是将字符串(例如“5 + 5”)拆分为vector
个字符串,例如{"5","+","5"}
。它不起作用。如果您认为代码太乱,请建议一种简化代码的方法。
到目前为止,这是我的代码:
#include <iostream>
#include <string>
#include <vector>
#include <ctype.h>
#include <sstream>
using namespace std;
vector<string> symbolize(string);
int main(int argc, const char * argv[])
{
string input;
cin >> input;
vector<string> symbols;
symbols = symbolize(input);
for(int i=0;i<symbols.size();i++){
cout<<symbols.at(i) << endl;
}
return 0;
}
vector<string> symbolize(string input){
int position = 0;
char c;
stringstream s;
vector<string> symbols;
enum symbolType {TEXT,OPERATOR}symbolType,charType;
while(position < input.size()){
c = input.at(position);
if(isalnum(c))symbolType = TEXT;
else symbolType = OPERATOR;
charType = symbolType;
while(symbolType == charType){
s << c;
position++;
if(position>=input.length())break;
c = input.at(position);
if(isalnum(c)) charType = TEXT;
else charType = OPERATOR;
}
symbols.push_back(s.str());
s.clear();
}
return symbols;
}
谢谢你看看。
编辑:BTW,我应该提到该函数返回第一个“令牌”,例如“5 + 5” - &gt; “5”
编辑2:我错了。我刚试过“5 + 5”,它返回{"5","5+","5+5"}
。但是,它只返回空格之前的第一个。抱歉混乱!
Edit3:谢谢大家!对于那些将来可能会遇到此页面的人来说,这就是所有内容完成后的代码:
#include <iostream>
#include <string>
#include <vector>
#include <ctype.h>
#include <sstream>
using namespace std;
vector<string> symbolize(string);
int main(int argc, const char * argv[])
{
string input;
getline(cin,input);
vector<string> symbols;
symbols = symbolize(input);
for(int i=0;i<symbols.size();i++){
cout<<symbols.at(i) << endl;
}
return 0;
}
vector<string> symbolize(string input){
int position = 0;
char c;
//stringstream s;
vector<string> symbols;
enum symbolType {TEXT,OPERATOR}symbolType,charType;
while(position < input.size()){
stringstream s;
c = input.at(position);
if(isalnum(c))symbolType = TEXT;
else symbolType = OPERATOR;
charType = symbolType;
while(symbolType == charType){
s << c;
position++;
if(position>=input.length())break;
c = input.at(position);
if (isspace(c)||c=='\n'){position++; break;}
if(isalnum(c)) charType = TEXT;
else charType = OPERATOR;
}
symbols.push_back(s.str());
}
return symbols;
}
答案 0 :(得分:3)
stringstream :: clear不会清除字符串缓冲区(只有错误状态)。
您可以使用stringstream::str(x)
设置字符串缓冲区,因此s.str(string())
或s.str("")
代替s.clear()
将清除字符串缓冲区。
此外,operator<<(istream, ...)
仅读取空格。
阅读时可以尝试使用:
答案 1 :(得分:3)
如果您想要读取整行而不是一个单词,请使用getline而不是operator&gt;&gt;。有关详细信息,请参阅http://www.cplusplus.com/reference/string/getline/,或者只需将第14行更改为“getline(cin,input);”。
另外,如果你想输出“5”,“+”,“5”而不是“5”,“5 +”,“5 + 5”,你需要每次循环时重置字符串流,并且明确不会那样做。最简单的方法是在外部循环中声明stringstream并摆脱清除调用。
答案 2 :(得分:1)
如果您在第一个stringstream s;
循环中移动while
,则应达到目的。
s.clear()
仅限resets the error state flags字符串流,它不像std::string::clear()