首页 > 解决方案 > 检查用户输入的整数是否包含全 1 或 0?

问题描述

我尝试将其转换为字符串并测试该字符串,但似乎找不到正确的方法来检查它并在用户输入 1 或 0 以外的内容时重新提示用户。

int binNum, decNum = 0, i = 0, remainderAmount;
string testString;

cout << "Enter a binary number: ";
cin >> binNum;
testString = to_string(binNum);
for (int i = 0; i < testString.length(); i++)
{
    while (testString[i] != 1 && testString[i] != 0)
    {
        cout << "Please enter a valid binary number: ";
        cin >> binNum;
        testString = to_string(binNum);
    }
}

cout << "Binary number: " << binNum << " is ";

while (binNum != 0)
{
    // Check if remainder is 0 or 1
    remainderAmount = binNum % 10;
    // Remove the last digit from the binary number
    binNum /= 10;
    // Get first decimal number
    decNum += remainderAmount*pow(2,i);
    // Increment the place for the binary power i
    i++;
}

cout << decNum << " in decimal" << endl;
cout << endl;

标签: c++c++11

解决方案


testString[i]是一个char,不是一个int

0并且1ints。

'0'并且'1'chars。

整数0与字符不同'0'(十六进制 0x30,十进制 48)。

整数1与字符不同'1'(十六进制 0x31,十进制 49)。

这就是您while无法正常工作的原因。

此外,每次提示用户输入新的输入字符串时,您都不会从头开始重新测试该字符串。您正在从先前错误输入停止的相同索引处获取。每次提示用户时,您都需要重新测试完整的输入。

尝试更多类似的东西:

bool isValid(int num) {
    string testString = to_string(num);
    for (int i = 0; i < testString.length(); i++) {
        if (testString[i] != '1' && testString[i] != '0')
            return false;
    }
    return true;

    /* alternatively:
    return (to_string(num).find_first_not_of("01") == string::npos);
    */
}

...

cout << "Enter a binary number: ";
do {
    if (cin >> binNum) {
        if (isValid(binNum)) {
            break;
        }
    } else {
        cin.clear();
        cin.ignore(numeric_limits<streamsize>::max(), '\n');    
    }
    cout << "Please enter a valid binary number: ";
}
while (true);

推荐阅读