Как мы можем принимать числовой ввод, пока не будут введены буквы?

#c #input

#c #ввод

Вопрос:

 cout << "Enter the numbers to be stored (end with a letter): "; 
cin >> number;
while(!(cin.fail())){
    numbers.push_back(number);
    cin >> number;
}
for(int i = 0; i < numbers.size(); i  ){
    node->insertKey(numbers.at(i));
}
int search;
cout << "Which number do you want to look up? ";
cin >> search;
  

Я хочу брать числа из пользовательского ввода, пока пользователь не введет букву.

После этого я хочу ввести другой пользовательский ввод. Мой вывод работает нормально. Поэтому, когда я ввожу букву, она останавливается. Но он не запрашивает второй ввод. Как я могу это исправить?

Комментарии:

1. Самый простой способ исправить это — переписать все, чтобы использовать std::getline для чтения каждой строки ввода, а затем проанализировать ее соответствующим образом.

Ответ №1:

Было бы лучше сначала сделать это так:

 while (cin >> number)
    numbers.push_back(number);
  

Приведенное выше оставляет пустое vector значение, если они вводят символ перед любым допустимым числом, в то время как ваш исходный код помещает бессмысленное число в vector .

Затем, если они ввели букву, cin поток будет переведен в состояние ошибки и по-прежнему будет содержать ввод символов, от которого вы захотите избавиться:

 // clear stream errors
cin.clear();
// actually get rid of the line with the character on it...
cin.ignore(std::numeric_limits<std::streamsize>::max(), 'n');
  

Затем вы можете продолжить цикл for и выполнить поток в search .

Ответ №2:

Когда cin установлены флаги ошибок fails, их необходимо очистить.

В дополнении вам нужно будет очистить stdin буфер, который будет содержать любые символы, которые не были проанализированы в предыдущем cin .

 //...
std::cin.clear(); //clear flags
cin.ignore(std::numeric_limits<std::streamsize>::max(), 'n'); //clear buffer
//...
int search;
cout << "Which number do you want to look up? ";
cin >> search;
//...
  

Комментарии:

1. Очистка / игнорирование должно быть перед попыткой потоковой search передачи.

2. @TonyDelroy, да, мой плохой, скопировал / вставил неправильно. Спасибо за предупреждение.

Ответ №3:

Я думаю, что это поможет

 cout << "Enter the numbers to be stored (end with a letter): "; 
cin >> number;
while(cin>>number){
    if(((char)number>='a' amp;amp; (char)number<='z')||((char)number>='A' amp;amp; (char)number<='Z'))break;
    numbers.push_back(number);
    cin >> number;
}
for(int i=0; i<numbers.size(); i  ){
    node->insertKey(numbers.at(i));
}
int search;
cout << "Which number do you want to look up? ";
cin >> search;