2010-07-18 3 views
15

Как бы проверить, действительно ли вход является двойным?как я могу проверить ввод пользователя как двойной в C++?

double x; 

while (1) { 
    cout << '>'; 
    if (cin >> x) { 
     // valid number 
     break; 
    } else { 
     // not a valid number 
     cout << "Invalid Input! Please input a numerical value." << endl; 
    } 
} 
//do other stuff... 

Приведенный выше код бесконечно выводит Invalid Input! заявление, поэтому его не запрашивая другой вход. Я хочу запросить ввод, проверьте, является ли это законным ... если его двойной, продолжайте ... если это НЕ двойное, подскажите еще раз.

Любые идеи?

+0

Обязательно посмотрите на руководство форматирования в следующий раз, когда вы сделать пост. Благодарю. – strager

+0

Что ты имеешь в виду? что не так с форматированием? – Hristo

+0

Я отредактировал ваше сообщение, но перед редактированием код не был отформатирован. Нажмите «Редактировать N мин. Назад», чтобы увидеть исходное сообщение. – strager

ответ

14

Попробуйте это:

while (1) { 
    if (cin >> x) { 
     // valid number 
     break; 
    } else { 
     // not a valid number 
     cout << "Invalid Input! Please input a numerical value." << endl; 
     cin.clear(); 
     while (cin.get() != '\n') ; // empty loop 
    } 
} 

В основном это очищает состояние ошибки, а затем читает и отбрасывает все, что был введен в предыдущей строке.

+0

- это внутри цикла while (1)? – Hristo

+0

Да, внутри существующего цикла. Я только что воспроизвел внутреннюю часть. – casablanca

+0

Хорошо, что работает. Можете ли вы объяснить логику пустого цикла? Что именно происходит там? Что делает 'get()' do? – Hristo

-3

Я бы использовал scanf вместо cin.

Функция scanf вернет количество совпадений из целевой строки. Для того, чтобы убедиться, что действительный дважды был разобран, убедитесь, что возвращаемое значение scanf равно 1.

Edit:
Изменено fscanf к scanf.

+0

Я хочу прочитать из командной строки ... не 'fscanf' для чтения из' FILE'? – Hristo

+0

Вопрос о том, как это сделать, используя 'cin'. – casablanca

+0

'scanf' предоставит такую ​​же функциональность, за исключением того, что будет считываться из' stdin' вместо произвольного файлового объекта. – advait

1

failbit будет установлен после использования оператора извлечения, если была ошибка синтаксического анализа, есть пара простых тестовых функций и fail вы можете проверить. Они точно противоположны друг другу, потому что они обрабатывают eofbit по-разному, но это не проблема в этом примере.

Затем, прежде чем повторять попытку, вы должны очистить failbit.

Как утверждает casablanca, вы также должны отбросить нечисловые данные, оставшиеся во входном буфере.

Итак:

double x; 

while (1) { 
    cout << '>'; 
    cin >> x; 
    if (cin.good()) 
     // valid number 
     break; 
    } else { 
     // not a valid number 
     cout << "Invalid Input! Please input a numerical value." << endl; 
     cin.clear(); 
     cin.ignore(100000, '\n'); 
    } 
} 
//do other stuff... 
+0

, это все еще вызывает бесконечный цикл для печати 'Invalid Input!' ... его не запрашивает другой вход. – Hristo

+0

Что делает 'cin.ignore()' do? – Hristo

+0

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

0

Один из способов - проверить равенство плавающего числа.

double x; 

while (1) { 
    cout << '>'; 
    cin >> x; 
    if (x != int(x)) { 
     // valid number 
     break; 
    } else { 
     // not a valid number 
     cout << "Invalid Input! Please input a numerical value." << endl; 
    } 
} 
+0

как это проверить для типа 'double'? – Hristo

+0

Это просто проверяет, имеет ли вход дробную часть, что, вероятно, не является тем, что подразумевалось под вопросом. –

+0

Да, большинство из нас знает, что имел в виду Христо, но этот ответ решает вопрос, который он задал: «Как бы проверить, действительно ли вход - это двойной?» Интерпретируя это так: «Я предполагаю, что получаю цифры, как я могу гарантировать, что они не целые числа?» делает это совершенно полезным ответом. Не нужно ниспровергать, имо. – chaosTechnician

0
#include <iostream> 
#include <string> 

bool askForDouble(char const *question, double &ret) 
{ 
     using namespace std; 
     while(true) 
     { 
       cout << question << flush; 
       cin >> ret; 
       if(cin.good()) 
       { 
         return true; 
       } 
       if(cin.eof()) 
       { 
         return false; 
       } 
       // (cin.fail() || cin.bad()) is true here 
       cin.clear(); // clear state flags 
       string dummy; 
       cin >> dummy; // discard a word 
     } 
} 

int main() 
{ 
     double x; 
     if(askForDouble("Give me a floating point number! ",x)) 
     { 
       std::cout << "The double of it is: " << (x*2) << std::endl; 
     } else 
     { 
       std::cerr << "END OF INPUT" << std::endl; 
     } 
     return 0; 
} 
+1

Проверка ввода должна была быть более простой задачей. Это очень трудно научить новичков и помочь им наслаждаться тем, что они делают. Я бы хотел увидеть пуленепробиваемый и по-прежнему полезный учебник по cin и cout для новичков. – Notinlist

0
bool is_double(double val) 
{ 
bool answer; 
double chk; 
int double_equl = 0;  
double strdouble = 0.0; 
strdouble = val;   
double_equl = (int)val; 
chk = double_equl/strdouble; 
if (chk == 1.00) 
{ 
answer = false; // val is integer 
return answer; 
} else { 
answer = true; // val is double 
return answer; 
} 
} 

 Смежные вопросы

  • Нет связанных вопросов^_^