Проблема с блоком try / catch - целое число между (0-9) консольной программой - PullRequest
0 голосов
/ 28 мая 2011

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

затем присваиваем значение вычитания значения ASCII zero из cNumber переменной iNumber, проверяем его в блоке try / catch и отслеживаем результаты умножения действительного (0-9) целого числа на 2.

#include <iostream>
using namespace std;

// Declare variables 
char cNumber;
int iNumber;

int main () {
  // Begin infinite while loop
  while (1) {
    // Prompt user to enter aa number within th range of (0-9)
    cout << "Please enter an number between 0 and 9: ";

    //Get character from the keyboard and validate it as integer 
    //within the range (0-9)
    try {
      //Assign user input alue into cNumber variable
      cin >> cNumber;

      //Subtract ASCII value of zero from cNumber and assign to iNumber 
      iNumber = cNumber - 48;
      if (iNumber < 0) {
        throw string(cNumber + " is not within the range of (0-9)");
      }
      if (iNumber > 9) {
        throw string(cNumber + " is not within the range of (0-9)");
      }
    }
    catch (exception ex) {
      cerr << cNumber + " is not a valid selection.... Input Error" << endl;
    }
    cout << "The result is " + iNumber * 2;
  }
}

Ответы [ 3 ]

3 голосов
/ 28 мая 2011

Непонятно, о чем вы спрашиваете, но я сделаю несколько снимков по вашим проблемам.

Выражение cNumber + " is not within the range of (0-9)" является сложением между char и char const*, что недопустимо. Вы, вероятно, случайно манипулируете адресами указателей.

Это возможно объединить char в строку, но это должен быть фактический std::string объект.

Итак:

throw cNumber + string(" is not within the range of (0-9)");

Точно так же вы неправильно используете + позже в своем коде.

Запись:

cerr << cNumber << " is not a valid selection.... Input Error" << endl;

Вы также бросаете std::string, но ловите std::exception. Строки не являются производными от исключений. Прочитайте главу в своей книге C ++ о try / catch. (Бросать / ловить строки в любом случае не рекомендуется, и ни один не ловит по значению.)

Кроме того, если вход не является числовым, извлечение в int завершится неудачно ... но у вас нет ошибок проверки / сброса в потоке cin.

Для каждой строки вашего кода взгляните на каждый его компонент и спросите себя: «Что это делает? Почему я написал это?» Если по какой-либо части кода вы не можете ответить и доказать ответ на эти два вопроса, остановитесь и подумайте, действительно ли это правильно.

2 голосов
/ 28 мая 2011

Вы бросаете std::string, но ваш блок catch объявлен как имеющий параметр std::exception.

Не знаю, может ли это несоответствие быть причиной вашей проблемы.

В любом случае не рекомендуется выбрасывать std::string, поскольку этот класс может генерировать исключения, а если при обработке предыдущего исключения выбрасывается исключение, возникает большая проблема (внезапное завершение).

0 голосов
/ 28 мая 2011

Мне кажется слишком сложным, почему бы просто:

#include <iostream>
using namespace std;

int main ()
{
  // Begin infinite while loop
    while (1) 
    {
        // Prompt user to enter aa number within th range of (0-9)
        cout << "Please enter an number between 0 and 9: ";

        // Get character from the keyboard and validate it as integer within the range (0-9)
        // Assign user input value into cNumber variable
        char cNumber;
        cin >> cNumber;

        // Subtract ASCII value of zero from cNumber and assign value to iNumber variable
        int iNumber = cNumber - 48;

        if (iNumber < 0 || iNumber > 9)
        {
            cerr << cNumber << " is not within the range of (0-9)" << endl;
        }
        else
        {
            cout << "The result is " + iNumber * 2;
        }
    }
}
...