今後の作業のために、C++ を使用して文字列を「シンボル」に分割しようとしています。私は長い間 C++ で何も書いていないので、このコードに本質的な問題がある場合はご容赦ください。
以下の関数の目的は、 "5+5" などの文字列を文字列symbolize()
に分割することです。動いていない。コードが乱雑すぎると思われる場合は、単純化する方法を提案してください。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」です。
編集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;
}