Как правильно разобрать подстроки, чтобы они могли быть эффективными для моего калькулятора newb ie? - PullRequest
0 голосов
/ 13 января 2020

Пожалуйста, если возможно, ELI5, так как я кодирую только несколько дней, и это моя первая программа! Ниже приведен фрагмент моего скрипта, который должен интерпретировать одну строку ввода, которую кто-то вводит (например, «5 + 5» или что-то в этом роде).

У меня есть другие операции, которые я хочу добавить позже, которые отформатированы иначе, именно поэтому я использую строку вместо функции переключателя или чего-то еще.

В любом случае ... это не работает :( Так что ниже мой логический процесс, и, возможно, кто-то может указать, где я испортил ?:)

Заранее спасибо!

   if (fork.find("+" && "-" && "x" && "/"))
{
    size_t pos = fork.find("+" && "-" && "x" && "/"); // Defines a position at the operator symbol
    string afterfork = fork.substr(pos + 1); // Cuts a substring at the operator symbol + 1
    size_t beforepos = fork.find_first_of(fork); // Defines a position at the beginning of the string
    string beforefork = fork.substr(beforepos); // cuts a substring at the begninning of the string
    string atfork = fork.substr(pos); // cuts a substring that only has one char (the operator +, -, x, etc)
    int x = stoi(beforefork.c_str()); // converts the first substring to an integer
    int y = stoi(afterfork.c_str()); // converts the third substring to an integer
    string operation = atfork; // converts the middle substring that only has one char to a different name.
    return input(x, operation, y); // will send this information to the input function (which will do the math for the calculator).
}

1 Ответ

1 голос
/ 13 января 2020

Чтобы найти в строке один из символов, вы можете использовать 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;. Только не надо!

...