Сравнение строк в C ++ с операторами IF? - PullRequest
0 голосов
/ 05 мая 2018

Я очень плохо знаком с C ++, только начал изучать онлайн-курс около 30 минут назад. Меня немного смущает, почему это сравнение строк не работает в базовом математическом скрипте:

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

int main() {
  int one, two, answer;
  char *oper;

  cout << "Add two numbers\n\nEnter your first number" << endl;
  cin >> one;
  cout << "Choose an operator: +  -  *  /  %%" << endl;
  cin >> oper;

  cout << "Enter your second number" << endl;
  cin >> two;

  if (oper == "+") {
    answer = one + two;
  }
  else if (oper == "-") {
    answer = one - two;
  }
  else if (oper == "*") {
    answer = one * two;
  }
  else if (oper == "/") {
    answer = one / two;
  }
  else if (oper == "%%") {
    answer = one % two;
  }

  cout << one << " " << oper << " " << two << " = " << answer << endl;

  return 0;
}

Значения для one, oper и two равны 1, "+" и 1 соответственно, но в конце выводится 1 + 1 = 4201435. Ни один из операторов if / else if не выполняется. Что вызывает это?

1 Ответ

0 голосов
/ 05 мая 2018

Вы сравниваете char *, используя operator==. Либо пусть oper будет std::string вместо

std::string oper

Чтобы использовать сравнение строк, перечисленное здесь: http://en.cppreference.com/w/cpp/string/basic_string/operator_cmp

или если вам нужно использовать char * для каких-либо ограничений, используйте strcmp:

if (!strcmp(oper, "+")) {
// ...

Вам также нужно, чтобы переменная операнда указывала на некоторый буфер, чтобы поток мог считывать. Это немного сложнее, и я просто рекомендую изменить тип oper на std::string.

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...