Как я могу ограничить ввод пользователя одним альфа-символом в C#?
Я использую следующий код, чтобы принять пользовательский ввод. Я хочу ограничить ввод пользователя только одним буквенным символом. Я нахожу множество проверок, использующих IsNumber для проверки целочисленного ввода, и много информации об использовании регулярных выражений для входной строки, но я не смог раскрыть, как я смогу ограничить возможности ввода с помощью этого кода. Может ли кто-нибудь указать мне правильное направление?
public char promptForGuess()
{
Console.Write("\nGuess a letter: ");
String pre = Console.ReadKey().Key.ToString();
string pre2 = pre.ToUpper();
char pre3 = Convert.ToChar(pre2);
}
3 ответа
Вы не можете ограничить пользователя, вводящего в консоли только z-символ - вы должны проверить ввод, он может написать любой символ (просто подумайте, когда ввод перенаправляется в вашу программу из файла с помощью <, например, yourapp.exe < input.dat).
Но легко проверить символ строчной буквой z. Например, с простой, ASCII, C тактикой (я буду использовать ваши переменные):
if('A' <= pre3 && pre3 <'Z') { // pre3 was made upper in your code
// input OK
} else {
// input NOK
}
С регулярным выражением:
Regex r = new Regex(@"^[a-zA-Z]$");
return r.IsMatch(pre);
Если вы не можете разрешить ввод символов без учета регистра, просто измените код, который я написал.
В любом случае, я думаю, что вам нужен Console.Read() (ReadKey также считывает такие клавиши, как стрелки, F1-F12 и т. Д., Поэтому все клавиши, даже клавиши табуляции и прописные буквы блокируются). См. MSDN: http://msdn.microsoft.com/en-us/library/system.console.read.aspx
И, возможно, вам следует использовать эту функцию, если вы будете поддерживать буквы Unicode: http://msdn.microsoft.com/en-us/library/yyxz6h5w.aspx Обратите внимание, что буквы Unicode обычно не один байт! Но чар может хранить это. Это, например, красивые венгерские буквы с острыми знаками и королем вещей: á, é, ő, ű, ö, ü и т. Д. (Но также много французского, а также голландский и т. Д.)
Для оценки правильной строки, вы можете судить по
str.length() == 1 && str[0] >= 'a' && str[1] <= 'z'
и для ограничения возможностей ввода вы можете написать цикл, который зацикливается, если ввод неверен.
pre = read();
while (!valid(pre))
pre = read();
Почему вы не используете Regex
if (Regex.IsMatch(pre[0].ToString(), @"[A-Za-z]"))
{
//do someting
}
else
{
//do someting
}