Может быть, просто, может быть, думая это, мы можем придумать решение.
Мы знаем, что operator>>
прекратит обработку при столкновении с символом, который не является цифрой. Поэтому мы можем использовать этот факт.
int multiplier = 0;
ss >> multiplier;
Следующие символы не являются цифрами, поэтому они могут быть символом оператора.
Что произойдет, если мы читаем в характере:
char operation = '?';
ss >> operation;
О, я забыл упомянуть, что operator>>
будет пропускать пробелы по умолчанию.
Наконец, мы можем ввести второй номер:
int multiplicand = 0;
ss >> multiplicand;
Чтобы подтвердить, давайте печатать то, что мы читаем в:
std::cout << "First Number: " << multiplier << "\n";
std::cout << "Operation : " << operation << "\n";
std::cout << "Second Number: " << multiplicand << "\n";
Использование отладчик здесь поможет показать, что происходит, поскольку каждое утверждение выполняется, по одному во время.
Edit 1: Более сложный
Вы всегда можете получить более сложный и использовать анализатор, лексера или написать свой собственный. Хорошим методом реализации является использование конечного автомата.
Например, вы должны прочитать один символ, а затем решить, что с ним делать в зависимости от состояния. Например, если символ представляет собой цифру, вы можете создать номер. Для символа (кроме пробела) преобразуйте его в токен и сохраните его где-нибудь.
Есть деревья синтаксического разбора и другие структуры данных, которые могут облегчить работу синтаксического анализа. Там также существуют библиотеки парсинга, такие как boost::spirit
, yacc, bison, flex и lex.
Вы, вероятно, нужен парсер. Посмотрите на як или бизон. –
Возможный дубликат [Разделить строку на C++?] (Http://stackoverflow.com/questions/236129/split-a-string-in-c) – Jonas
Спасибо, что я узнал, что поток строк прекращает чтение при встрече другого типа. –