Чтобы найти в строке один из символов, вы можете использовать find_first_of
. Эта функция возвращает npos
, если ничего не нашла.
const size_t operatorPos = input.find_first_of("+-*/");
if (operatorPos == std::string::npos) {
std::cout << "Couldn't find an operator!\n";
return;
}
Чтобы разбить строку на две подстроки, вы можете использовать substr
. Чтобы получить символ в позиции, используйте operator[]
.
const std::string left = input.substr(0, operatorPos);
const std::string right = input.substr(operatorPos + 1);
const char operation = input[operatorPos];
Чтобы преобразовать строку в целое число, ну, есть много вариантов. Я буду использовать std::stoi
для этого ответа. Эта функция выдает исключение, которое нам нужно перехватывать , когда она не может преобразовать строку в целое число.
int leftInt;
try {
leftInt = std::stoi(left);
} catch (...) {
std::cout << '"' << left << "\" is not a valid integer!\n";
return;
}
int rightInt;
try {
rightInt = std::stoi(right);
} catch (...) {
std::cout << '"' << right << "\" is not a valid integer!\n";
return;
}
Если исключения действительно сбивают с толку (это Мне понадобились целые годы, чтобы обдумать исключения!) Затем вы можете попробовать другую функцию. Мой любимый (и лучший из IMO) std::from_chars
. Другой вариант - просто не ловить исключение.
const int leftInt = std::stoi(left);
const int rightInt = std::stoi(right);
В этом случае вы не получите красивое сообщение об ошибке типа "five" is not a valid integer!
. Вы получите что-то вроде:
libc++abi.dylib: terminating with uncaught exception of type std::invalid_argument: stoi: no conversion
Abort trap: 6
Попробуйте запустить std::stoi("five")
и убедитесь сами!
Пожалуйста, не используйте using namespace std;
. Только не надо!