gpt4 book ai didi

c++ - 为什么这个函数不分解这个输入字符串?

转载 作者:行者123 更新时间:2023-11-30 00:38:35 25 4
gpt4 key购买 nike

我正在尝试使用 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;
}

感谢您的关注。

编辑:顺便说一句,我应该提到函数返回第一个“ token ”,例如“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;
}

最佳答案

如果您想读取整行而不是一个单词,请使用 getline 而不是运算符>>。参见 http://www.cplusplus.com/reference/string/getline/有关详细信息,或只需将第 14 行更改为“getline(cin, input);”。

另外,如果要输出“5”、“+”、“5”而不是“5”、“5+”、“5+5”,则每次循环都需要重新设置stringstream,而 clear 不会那样做。解决此问题的最简单方法是仅在外循环中声明 stringstream 并摆脱 clear 调用。

关于c++ - 为什么这个函数不分解这个输入字符串?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10358598/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com