Некоторая справочная информация, для домашнего задания мне пришлось написать калькулятор польской нотации с использованием двоичных деревьев, чтобы это работало, мне пришлось проанализировать ввод командной строки, чтобы он правильно построил двоичное дерево, а затем просмотреть его, чтобы получить правильный ответ на математическое выражение, которое было введено.
Для синтаксического анализа я использовал std :: stringstream, чтобы я мог легко преобразовать std :: string, которую мне передали, в допустимое число с плавающей точкой (или целое число double). Проблема, с которой я столкнулся, заключалась в следующем коде, в котором показана ошибка, и как я ее решил. Я надеялся, что кто-нибудь сможет мне сказать, что я делаю что-то не так и что .clear () не верен, или это ошибка в стандартной библиотеке в том, как она обрабатывает этот конкретный ввод (происходит только для + и -).
#include <iostream>
#include <sstream>
#include <string>
int main() {
std::string mystring("+");
int num;
char op;
std::stringstream iss(mystring);
iss >> num;
// Seems it is not a number
if (iss.fail()) {
// This part does not work as you would expect it to
// We clear the error state of the stringstream
iss.clear();
std::cout << "iss fail bit: " << iss.fail() << std::endl;
iss.get(op);
std::cout << "op is: " << op << " iss is: " << iss.str() << std::endl;
std::cout << "iss fail bit: " << iss.fail() << std::endl;
// This however works as you would expect it to
std::stringstream oss(iss.str());
std::cout << "oss fail bit: " << oss.fail() << std::endl;
oss.get(op);
std::cout << "op is: " << op << " oss is: " << oss.str() << std::endl;
std::cout << "oss fail bit: " << oss.fail() << std::endl;
} else {
// We got a number
}
}
Пример вывода из программы:
iss fail bit: 0
op is: iss is: +
iss fail bit: 1
oss fail bit: 0
op is: + oss is: +
oss fail bit: 0
Возможно, вы, ребята, увидите что-то, что я пропустил, или это действительно ошибка выше моей программы, и в этом случае будет очень признателен указатель того, куда сообщать об этом.