В вашем коде есть несколько проблем, которые вы найдете рано или поздно.
Кстати. Ваш текущий код не компилируется. Я предполагаю, что у вас есть ;
после cout << "Correct input."
и }
между закрывающей скобкой if
и return
, иначе ваш пример никогда не будет l oop даже один раз.
Проблема, которую вы упомянули
Вы не очищаете userInput
(и ваш sizeOfCharArray
не готов к этому).
Давайте go шаг за шагом с вашим кодом :
userInput[maxInput] = { "\0" }; //userInput contains all null characters
- Пользовательские данные
rwt
userInput
содержит "rwt\0"
- Ваш код правильно видит его как недействительный input и снова запрашивает ввод
- Вводимые пользователем данные
1
userInput
перезаписывается введенной пользователем строкой, но заранее не очищается . Теперь он содержит 1\0t\0
sizeOfCharArray
, вычисляет все ненулевые символы и возвращает 2. - Ваш l oop продолжает запрашивать ввод.
Вы возвращаете адрес локальной переменной
После ValidateInput
массив userInput
не работает. Ушел навсегда. И вы возвращаете адрес в мертвый массив, память, которую компилятор может использовать по своему усмотрению.
Ваш код слишком запутанный
Это часто недооцениваемая проблема, но простой код = легкое чтение = меньше ошибок.
Вы хотите целое число, верно? Так как же при чтении целого числа из входных данных ?
int GetInput() {
int result {};
while (true) { //infinite loop
cin >> result;
if(!cin.good()) {
cout << "Input wasn't a number, please try again.\n";
cin.clear(); //clear flags that were raised
cin.ignore(numeric_limits<streamsize>::max(), '\n'); // skip any input remaining in the stream
} else if (!InputIsValid(result)) {
cout << "Input not in 1-4 range, please try again.\n";
} else {
return result;
}
}
}
bool InputIsValid(int input) {
return input >= 1 && input <= 4;
}
std::cin
повысит свой бит fail
, если не удастся извлечь запрашиваемый тип (в данном случае int
), и переменная обнуляется (начиная с C ++ 11). Если бит fail
установлен, метод good()
вернет false
(т.е. поток не находится в хорошем состоянии). На следующей итерации мы очищаем флаги и все оставшиеся входные данные из потока.
Вы также можете проверить действительный диапазон целого числа в l oop (здесь это делается как отдельная функция).
Мы вырвались из l oop, используя оператор return
. Если все правильно (т. Е. Потоку удалось прочитать правильный тип ввода, а ввод находится в допустимом диапазоне), мы возвращаем конечное значение пользователю.
В связи с проблемами с qoutes: Одинарные и двойные кавычки в C или C ++ . Пожалуйста, для собственного психического здоровья не добавляйте символы случайным образом, пока компилятор не перестанет отображать ошибки, это никогда хорошая идея Компилятор - ваш друг, он поможет вам определить проблемы, но только если вы поможете ему это сделать.