Как я могу ограничить ввод пользователя одним альфа-символом в 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
   } 
Другие вопросы по тегам