Я пытаюсь разбить строку на «символы» с помощью 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;
}
Спасибо за взглянуть.
Edit: Кстати, я должен отметить, что функция возвращает кулак "маркер", например, "5 + 5" -> "5"
Edit2: Я ошибся. Я просто попробовал «5 + 5», и он вернулся {"5","5+","5+5"}
. Однако он возвращает только первый пробел. Извините за беспорядок!
Редактировать3: Спасибо всем! Для тех, кто может прийти на эту страницу, в будущем, вот код, когда все сказано и сделано:
#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;
}
Что такое _supposed_, чтобы вернуться.Из вашего последнего комментария, «он возвращает только первый перед пробелом», похоже, ваша жалоба заключается в том, что «5 + 5 6 + 6» только анализирует пространство и останавливается. Если это так, это потому, что вы только делаете «cin >> input» один раз и читаете до пробела. – abarnert
Должен ли быть тест на пробелы? Логика предполагает, что ничего, кроме буквенно-цифрового, не является оператором. – wallyk
@abarnert Да, это была моя оригинальная проблема. Каким другим способом я могу использовать пробелы? – Hassan