2014-01-16 4 views
0

Я хочу, чтобы пользователь вводил символ. Я хочу отфильтровать, что они входят, и взять только первый символ, который они набирают.cin.get() получить слишком много

int main(){ 
    while (true){ 
     char n = readOption(); 
     cout << n << std::endl; 
    } 
    return 0; 
} 


char readOption() { 
    char input = '\0'; 
    while (input != '\n') { 
     input = cin.get(); 
     if (isalpha(input)) { 
      break; 
     } 
    } 
    return toupper(input); 
} 

Если я нахожу [email protected] jkjoi, консоль печатает.

J 
K 
J 
O 
I 

Я только хочу, чтобы он печатал J. Почему он печатает и другие буквы?

+0

Это комедийный код? Вы знаете, что вы должны завершать инструкции с точкой с запятой в C++, правильно? –

ответ

2

Он печатает все символы, потому что (после того, как вы исправить ошибку полу-ободочной кишки) Ваша петля навсегда:

while (true) 
{ 
    char n = readOption(); 
    cout << n << std::endl; 
} 

Это будет вызывать функцию чтения снова и снова, навсегда! Ваша функция чтения пеет до тех пор, пока он не получит буквенный символ, поэтому он игнорирует "[email protected] " и затем захватывает 1 символ для каждой итерации цикла while (true). Если вы хотите, чтобы остановить после прочтения первой альфа-символ, не стоит цикл:

char n = readOption(); 
cout << n << std::endl; 

Изменено

свой комментарий, вы можете переписать код полностью:

std::locale loc; 
char c = '\0'; 
do 
{ 
    // get a character with error checking 
    while (!(std::cin >> c)) 
    { 
     std::cin.clear(); 
     std::cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n'); 
    } 
} while (!std::isalpha(c, loc)); 
// ignore the rest of the input 
std::cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n'); 
+0

Как мне написать код, чтобы разрешить ввод нового пользователя? Если я избавлюсь от цикла, но просто добавлю новое n = readOption(); и новый cout, он не будет запрашивать новый пользовательский ввод, вместо этого он ведет себя так же, как сейчас. – Chronicle

+2

@Chronicle Я не уверен, что понимаю, что вы пытаетесь сделать, но если вы хотите отбросить остальную часть строки и попросить пользователя ввести новый ввод, добавьте 'std :: cin.ignore (std :: numeric_limits :: max(), '\ n'); 'в цикле' while'. – Praetorian

+0

@Chronicle Вы хотите, чтобы пользователь * просто * ввел один буквенно-цифровой символ? Вы хотите сохранить или отбросить остальную часть ввода после этого символа? –

2

Потому что вы его попросили.

Вы выполняете это в цикле, навсегда.

Если вы хотите сделать это один раз, просто сделайте это один раз. Удалите петли.

Смежные вопросы