2014-10-29 2 views
0

Я пытаюсь написать цикл, который проверяет ввод пользователя, а затем повторяет, если вход плохой. Вход должен быть либо двоичным числом (как строка), либо десятичным числом (как int). У меня есть отдельные функции для проверки этого ввода, но они не вызывают никаких проблем.cin непреднамеренно пропускает пользовательский ввод

Проблема возникает, когда я выбираю 1 или 2, а затем добровольно вводим недопустимое двоичное или десятичное число. На этом этапе цикл do-while повторяется успешно. Программа печатает еще один запрос для ввода пользователем cout, но когда приходит время для ввода пользователем ввода, программа думает, что есть вход в консоли, прежде чем я даже что-нибудь введу. Я считаю, что это проблема с whitespace/control символами в буфере, но я не знаю, как это исправить. Я пробовал использовать std::cin >> std::ws, чтобы очистить любое свободное пространство, но не повезло.

#include <iostream> 
#include <string> 
#include <limits> 
#include <stdlib.h> 
#include <stdio.h> 
#include <ctype.h> 

using std::cout; 
using std::cin; 
using std::endl; 
using std::numeric_limits; 
using std::max; 
using std::streamsize; 
using std::string; 



//int toDecimal; 

//true is is binary 
bool validateBinary(const string &binaryNumber){ 
    for(int i = 0; i < binaryNumber.length(); i++){ 
     if((binaryNumber[i] != 1) && (binaryNumber[i] != 0)){ 
      return false; 
     } 
    } 
    return true; 
} 
//true if is decimal 
bool validateDecimal(){ 
    return cin; 
} 

int main() { 
    int conversionType = 0; //we initialize conversionType to a default value of 0 to ensure the copiler it will always have a value 
    bool isBinary = false; 
    bool isDecimal = false; 
    string binaryNumberInput; 
    int decimalNumberInput; 

    do { 
     if(conversionType == 0){ 
     cout << "Enter 1 to convert binary to decimal," << endl; 
     cout << "2 to convert decimal to binary, " << endl; 
     cout << "or 3 to exit the program: "; 
     std::cin >> std::ws; //to clear any whitespace fron cin 
     cin >> conversionType; //upon a second iteration, this value is read in before a user input is given 
     } 

     if(!cin || (conversionType != 1 && conversionType != 2)){ 
      cout << "Incorrect input." << endl; 
      cin.clear(); //clear the fail bit 
      cin.ignore(numeric_limits<streamsize>::max(), '\n'); //used to ignore not-numeric input 
     } 

     cout << "You have selected option " << conversionType << "." << endl; 

     if(conversionType == 1){ 
      cout << "Please enter a binary number: "; 
      cin >> binaryNumberInput; 
      isBinary = validateBinary(binaryNumberInput); 
      if(!isBinary){ 
       cout << "The numbered you entered is not a binary number!" << endl; 
       conversionType = 0; 
      } 
     } 

     if(conversionType == 2){ 
      cout << "Please enter a decimal number: "; 
      cin >> decimalNumberInput; 
      isDecimal = validateDecimal(); //true if succeeded, meaning is a number 
      if(!isDecimal){ 
       cout << "The numbered you entered is not a decimal number!" << endl; 
       conversionType = 0; 
      } 
     } 
    } 
    while((conversionType != 1 && conversionType != 2) || (isBinary == isDecimal)); 


    return 0; 

} 

ответ

2

Вместо того, чтобы отладить текущую программу, вы можете рассмотреть вопрос об использовании стандартной библиотеки просто вещи

#include <iostream> 
#include <string> 
#include <bitset> 
#include <climits> 
#include <limits> 

template<typename T> 
void get(T& value) 
{ 
    while (!(std::cin >> value)) { 
    std::cout << "Invalid input\n"; 
    std::cin.clear(); 
    std::cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n'); 
    } 
} 

int main() 
{ 
    std::cout << "Enter 1 to convert binary to decimal,\n" << 
       "2 to convert decimal to binary\n"; 

    int option; 

    if (std::cin >> option) { 
    switch (option) { 
     case 1: { 
     std::bitset<CHAR_BIT * sizeof(unsigned long long)> bits; 
     get(bits); 
     std::cout << bits.to_ullong() << '\n'; 
     break; 
     } 

     case 2: { 
     unsigned long long i; 
     get(i); 
     std::cout << std::bitset<CHAR_BIT * sizeof i>(i) << '\n'; 
     break; 
     } 
    } 
    } 
} 

Если вы хотите, чтобы петли вы должны быть в состоянии добавить его снова достаточно легко ,

+0

Спасибо, но для этого задания нам не разрешено использовать какие-либо функции преобразования, иначе это было бы моим первым выбором. – FluffyKittens

+0

@AdamJ В этом случае вы можете использовать общую логику выше для обработки ошибок ввода. Также в следующий раз дайте понять, что вы можете и не можете использовать в вопросе, если это задание. – user657267

+0

Я ценю помощь, но я действительно ищу ответ на вопрос, почему мой код отказывается читать значение cin, когда цикл повторяется. Я хочу знать для своих собственных целей обучения, а не только для того, чтобы конкурировать с заданием. – FluffyKittens

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