2015-11-02 1 views
0

У меня возникли проблемы с пониманием того, как правильно манипулировать строками. Программа ниже - простой калькулятор.Разбиение строки getline() на несколько переменных int и char?

Когда я вводил вход непосредственно в переменные с помощью нескольких инструкций cin, все работало нормально. Теперь я хочу взять ввод как строку с getline() и сохранить числа/операторы в существующих переменных из getline().

Моей главной проблемой является то, что я хочу, чтобы программа распознавала как 2+2, так и 2 + 2.

#include <iostream> 
#include <string> 
#include <sstream> 

using namespace std; 

int main() 
{ 
    int Num1, Num2, Num3 = 0, result; 
    char Operator1, Operator2 = 0; 
    string input, in1; 

    cout << "Enter your equation on one line.\n"; 
    getline(cin, input); 


    //this is where getline needs to be manipulated into Num1/2/3 and Operator1/2 

    cout << input; 


    if (Operator2 != 0) 
    { 
     if (Operator1 == '+') 
     { 
      if (Operator2 == '+') 
      { 
       result = Num1 + Num2 + Num3; 
       cout << "I made it to A!"; 
      } 
      else if (Operator2 == '-') 
      { 
       result = Num1 + Num2 - Num3; 
      } 
      else if (Operator2 == '/') 
      { 
       result = Num1 + Num2/Num3; 
      } 
      else if (Operator2 == '*') 
      { 
       result = Num1 + Num2 * Num3; 
      } 
     } 
     else if (Operator1 == '-') 
     { 
      if (Operator2 == '+') 
      { 
       result = Num1 - Num2 + Num3; 
      } 
      else if (Operator2 == '-') 
      { 
       result = Num1 - Num2 - Num3; 
      } 
      else if (Operator2 == '/') 
      { 
       result = Num1 - Num2/Num3; 
      } 
      else if (Operator2 == '*') 
      { 
       result = Num1 - Num2 * Num3; 
      } 
     } 
     else if (Operator1 == '/') 
     { 
      if (Operator2 == '+') 
      { 
       result = Num1/Num2 + Num3; 
      } 
      else if (Operator2 == '-') 
      { 
       result = Num1/Num2 - Num3; 
      } 
      else if (Operator2 == '/') 
      { 
       result = Num1/Num2/Num3; 
      } 
      else if (Operator2 == '*') 
      { 
       result = Num1/Num2 * Num3; 
      } 
     } 
     else if (Operator1 == '*') 
     { 
      if (Operator2 == '+') 
      { 
       result = Num1 * Num2 + Num3; 
      } 
      else if (Operator2 == '-') 
      { 
       result = Num1 * Num2 - Num3; 
      } 
      else if (Operator2 == '/') 
      { 
       result = Num1 * Num2/Num3; 
      } 
      else if (Operator2 == '*') 
      { 
       result = Num1 * Num2 * Num3; 
      } 
     } 
     else 
     { 
      cout << "I don't recognize that operator. Did you type in one of these?: + - * /"; 
     } 
    } 
    else if (Operator2 == 0) 
    { 
     if (Operator1 == '+') 
    { 
      result = Num1 + Num2; 
    } 
     else if (Operator1 == '-') 
    { 
      result = Num1 - Num2; 
    } 
     else if (Operator1 == '*') 
    { 
      result = Num1 * Num2; 
    } 
     else if (Operator1 == '/') 
    { 
      result = Num1/Num2; 
    } 
     else 
    { 
     cout << "I don't recognize that operator. Did you type in one of these?: + - * /"; 
    } 

     result = Num1 + Num2; 
     cout << "I made it to B!"; 
    } 


    cout << "Your result is: " << result << endl << endl; 

    return 0; 
} 

Любая помощь будет оценена, но я бы предпочел объяснение рабочего кода.

Меня не интересует математическая логика или using namespace std аспекты программы.

+0

Кроме того, пожалуйста, игнорируйте cout << «Я сделал это для x!» Это были некоторые тесты, которые я забыл вынести. – DoubleLlama

+0

[Здесь] (http://stackoverflow.com/questions/23047052/why-does-reading-a-record-struct-fields-from-stdistream-fail-and-how-can-i-fi) - некоторые подсказки чтобы облегчить вашу жизнь. Используйте 'std :: istringstream'. –

+0

Будет ли операция всегда быть единственным символом? – NathanOliver

ответ

0

Прежде всего, вы должны спросить себя, нужно ли хранить всю строку, а не просто использовать cin по переменным напрямую, как вы сказали ранее.

Если вы действительно хотите сохранить всю строку (как вы теперь вторя его), вы могли бы рассмотреть вопрос об использовании stringstream (вы уже в том числе sstream в файле, по какой-то причине):

getline(cin, input); 

std::istringstream iss(input); 
// you can now use iss just as cin. 
// I'm not sure exactly what you want to do, but it would look something like this: 
iss >> num1; 
iss >> Operator1; 
iss >> num2; 

cout << input; 
+0

Удивительный! Кажется, что Stringstream именно то, что мне нужно. Благодаря! – DoubleLlama

+2

@DoubleLlama Просто 'std :: istringstream' достаточно,' std :: stringstream' имеет свои странности. –