cin无意中跳过了用户输入

时间:2014-10-29 03:40:44

标签: visual-c++

我正在尝试编写一个验证用户输入的循环,然后在输入错误时重复。输入必须是二进制数(作为字符串)或十进制数(作为int)。我有单独的函数来验证这个输入,但它们没有造成任何麻烦。

当我选择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;

}

1 个答案:

答案 0 :(得分:1)

您可能需要考虑将标准库用于简单的事情

,而不是调试当前的程序
#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;
      }
    }
  }
}

如果你想让它循环,你应该能够轻松地再次添加它。