как обрабатывать пробелы в stringstream в cpp? - PullRequest
0 голосов
/ 02 марта 2019

Я решал ArithmaticII .Я получаю правильный вывод для ввода ниже:

4
1 + 1 * 2 =
29 / 5 =
103 * 103 * 5 =
50 * 40 * 250 + 791 =

Вывод:

4
5
53045
500791

Я получаю правильный вывод, но когда я отправляю свое решение в spoj, я получаюSIGABRT ошибка во время выполнения.

Примечание: он также может содержать пробелы для улучшения читабельности.

Так как ввод может не содержать пробелов, как я могу это обработать, потому что это вызывает ошибку.

потому что моя программа останавливается (ошибка времени выполнения), когда я не предоставляю место на входе (1 * 1 + 2 =)

terminate called after throwing an instance of 'std::invalid_argument'
  what():  stoll

Пожалуйста, помогите.Что мне делать?

#include<iostream>
#include<string>
#include<sstream>
using namespace std;

int main() {
    int t;
    string str;
    cin >> t;

    while (t--) {


        ///using cin.ignore() as input as preceded by a single line  
        cin.ignore();
        getline(cin, str, '\n');
        stringstream split(str);
        ///now use getline with specified delimeter to split string stream
        string intermediate;
        int flag = 0;
        long long int ans=1;
        while (getline(split, intermediate, ' ')) {
            if (intermediate == "=") {
                cout << ans<<"\n";
                break;

            }
            if (intermediate == "*") {
                flag = 1;
                continue;
            }
            else if (intermediate == "/") {
                flag = 2;
                continue;
            }
            else if (intermediate == "+") {
                flag = 3;
                continue;
            }
            else if(intermediate == "-"){
                flag = 4;
                continue;
            }
            if (flag == 1) {
                ans *= stoll(intermediate);
            }
            else if (flag == 2) {
                ans /= stoll(intermediate);
            }
            else if (flag == 3) {
                ans += stoll(intermediate);
            }
            else if (flag == 4) {
                ans -= stoll(intermediate);
            }
            else if (flag == 0) {
                ans = stoll(intermediate);
            }
        }
    }
}

1 Ответ

0 голосов
/ 02 марта 2019

Принять ввод по одной строке за раз.Поместите первое число в ответ.Затем переберите остальную часть строки символом.Если символ является арифметическим оператором ('*' или '+' или '/' или '-'), то после него будет число. Вычтите число и выполните указанную операцию.Если символ «=», выведите ответ.

Подсказка: как извлечь число?

1. Первое число начинается с начала и продолжается до первого арифметического оператора.
2.Все остальные числа находятся между арифматическими операторами или '='.

...