testString[i]
- это char
, а не int
.
0
и 1
- int
с.
'0'
и '1'
равны char
с.
Целое число 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);