2016-06-26 3 views
2

Я делаю простую программу, где пользователю нужно ввести несколько возможных символов. Я хочу, чтобы возможные входные данные были только i, c, l, v, h, k, f, s, x. Я понимаю, что могу сделать что-то вроде:Ограничение ввода пользователем

char a; 
bool s(false);  
cin>>a; 
do 
{ 
switch(a) 
case 'i': ... 
case 'c': ... 
... 
default: cout<<"Invalid input! Try again: "; cin>>a; s=true; 
} while(s); 

Однако, я уверен, что есть более благодатное решение. Я предполагаю, что перечисления будут задействованы. Кто-нибудь будет так любезны рассказать об этом мне, потому что я не мог найти абсолютно ничего на эту тему.

+0

Правильно ли я понимаю, что вам не нравится, что неправильный символ также отображается на экране, и именно поэтому вы печатаете «Недопустимый ввод»? Если пользовательский ввод не будет эхом, и вам нужно будет эхо его самостоятельно, но только если введенный символ введен, решит ли он вашу проблему? – mvidelgauz

+0

Если пользователь вводит только один символ, то оператор switch действительно является лучшим решением для этого. Я полагаю, вы могли бы иметь длинные «если» утверждения, например. if (a == 'i' || a == 'c' || и т. д.), но это кажется намного более беспорядочным ИМО. – Fibbles

ответ

3

Простое решение может быть:

const string allowed{"iclvhkfsx"}; 
while ( cin.get(a) && allowed.find(a)== string::npos) 
    cout << "Incorect input, try again ! "; 

код петли, пока действительный символ не вводится (или ВФ достигается).

Online demo

Такое решение может быть обобщена на другие типы данных, чем с помощью символов basic_string<T> (demo for integers). Конечно, switch совершенно справедлив, но я думаю, что его преимущество выше, когда разные входные данные чаще всего требуют различной обработки.

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