Как очистить строку ввода, а не только один символ - PullRequest
0 голосов
/ 05 февраля 2019

Извините, если это простой вопрос, я новичок.Я хочу быть в состоянии очистить ввод от Cin, если это не ожидаемый тип.У меня это работает для одного символа или значения, но проблема возникает, когда я ввожу более одного символа в строке.

Например, пользователю предлагается двойное значение.Если это не двойное, я получаю сообщение об ошибке и повторяю.Это также должно произойти, если я введу более длинную строку.

EX 1: ожидаемый результат

Enter initial estimate: a

The initial estimate is not a number.
Enter initial estimate: afdf

The initial estimate is not a number. 

EX 2: В моем коде в настоящее время afdf постоянно читается, поэтому я получаю:

Enter initial estimate of root : a

The initial estimate was not a number
Enter initial estimate of root : afdf

The initial estimate was not a number
Enter initial estimate of root :
The initial estimate was not a number
Enter initial estimate of root :
The initial estimate was not a number
Enter increment for estimate of root :
The increment was not a number

Я попытался использовать cin.clear () и cin.get (), а также посмотрел на getline (), но это не сработало.

 while (numTries < 4)
 {
   numTries++;
   cout << "Enter initial estimate of root : ";
   cin >> estimate;

   if (!(cin.fail()))
   {
     if ((estimate >= minEst) && (estimate <= maxEst))
     {
       break;
     }
     else
     {
       if (numTries == 4)
       {
         cout << "ERROR: Exceeded max number of tries entering data" << endl;
         return 0;
       }
       cout << "" << endl;
       cout << "Value you entered was not in range\n";
       cout << fixed << setprecision(3) << minEst << " <= initial estimate <= " << maxEst << endl;
     }
   }
   else
   {
   cout << "\nThe initial estimate was not a number\n";
   cin.clear();
   cin.get();
   }
 }

Как я могу убедитьсяввод очищается при следующем вводе?Могу ли я использовать getline () для достижения этой цели?Заранее спасибо.

Ответы [ 2 ]

0 голосов
/ 05 февраля 2019

Если вы хотите придерживаться cin, вы можете игнорировать оставшуюся часть строки с помощью cin.ignore ()

#include<limit>
...

double estimate;
do {
    if(cin.fail()) {
        cin.clear();
        cin.ignore(numeric_limits<streamsize>::max(), '\n');
        cout << "The initial estimate was not a number" << endl;
    }
    cout << "Enter initial estimate of root: ";
    cin >> estimate;
    cout << endl;
} while(!cin);

Getline может быть лучшим вариантом, так как он получает строку из входного потока, разделенную символом новой строки (\ n).

do {
    if(cin.fail()) {
        cin.clear();
        cout << "The initial estimate was not a number" << endl;
    }
    cout << "Enter initial estimate of root: ";
} while(!getline(cin, estimate);
0 голосов
/ 05 февраля 2019

Вы можете получить входные данные в виде строки и проанализировать их, чтобы проверить, является ли это число:

bool convert_string_to_double(const std::string &str, double &out_value){
    try{
        out_value = stod(str);
        return true;
    } catch (const std::invalid_argument &e) {
        return false;
    }
}

bool get_double_from_input(double &out_value){
    std::string input_str;

    cin >> input_str;

    return convert_string_to_double(input_str, out_value);
}

Затем используйте get_double_from_input, чтобы получить двойные значения из ввода.Он вернет false, если не удалось преобразовать значение в удвоенное значение, или вернет true и сохранит результат в out_value.

...