Если вы введете fd
, он выведет некоторые цифры, потому что эти цифры есть то, что lol
происходит в них до того, как оно будет присвоено. cin >> lol
не записывается в lol
, потому что у него нет приемлемого ввода для ввода, поэтому он просто оставляет его в покое, а значение - независимо от того, что было до вызова. Затем вы выводите его (это UB).
Если вы хотите, чтобы убедиться, что пользователь ввел что-то приемлемое, вы можете обернуть >>
в if
:
if (!(cin >> lol)) {
cout << "You entered some stupid input" << endl;
}
Также вы можете назначить lol
перед чтением в так что если читать терпит неудачу, он все еще имеет некоторое приемлемое значение (и не UB использовать):
int lol = -1; // -1 for example
Если, например, вы хотите, чтобы цикл до тех пор, пока пользователь не дает какой-то действительный вход, вы можете сделать
int lol = 0;
cout << "enter a number(int): ";
while (!(cin >> lol)) {
cout << "You entered invalid input." << endl << "enter a number(int): ";
cin.clear();
cin.ignore(numeric_limits<streamsize>::max(), '\n');
}
// the above will loop until the user entered an integer
// and when this point is reached, lol will be the input number
Я не знаю почему, но он все еще ухаживает за случайным числом, когда я ввожу что-то, а не число, почему это? –
@BartekSowka по причине, что я сказал. 'lol' имеет некоторое неинициализированное значение, и оно не изменяется, если пользователь вводит то, что не является числом. 'If' скажет вам, был ли изменен lol. Вы не должны вывести 'lol'_, если пользователь вводил что-то, что не является числом. –
@BartekSowka см. Обновление в моем ответе выше для примера. –