【发布时间】:2012-04-27 22:17:59
【问题描述】:
我正在尝试使用 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;
}
感谢观看。
编辑:顺便说一句,我应该提到该函数返回第一个“令牌”,例如“5+5”->“5”
Edit2:我错了。我刚刚尝试了“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;
}
【问题讨论】:
-
什么是应该返回。从您的最后一条评论中,“它只返回空格前的第一个”,听起来您的抱怨是“5+5 6+6”只解析到空格然后停止。如果是这样,那是因为您只执行“cin >> input”一次,并且读取到空格。
-
应该对空格进行测试吗?逻辑假设任何不是字母数字的都是运算符。
-
@abarnert 是的,那是我最初的问题。我还可以使用什么其他方式来包含空格?
-
另外,如果您想要“5”、“+”和“5”而不是“5”、“5+”和“5+5”,问题在于 stringstream.clear () 不会像您认为的那样做。它清除流错误标志。如果您想在每次循环中清除整个内容,最简单的方法是将变量移动到外部 while 循环中。
-
@wallyk 我使用了“运营商”这个名称,因为我想不出更好的术语。但是,是的,这不仅适用于运营商。