2017-01-04 3 views
1

В настоящее время я самостоятельно учил себя C# и имел довольно приличное понимание, но я потерял, как проверить, что только пользователь вводит один ответ на слово и что он капитализирован в противном случае, я хочу дать им еще один шанс попробовать.Подтверждающий пользователь вводит только один ответ на слово и что первая буква заглавная

Это то, что я до сих пор:

static void Main(string[] args) 
    { 
     //assigned variable 
     string userInput; 
     //intializing empty string 
     string answerInput = string.Empty; 
     //Creating loop 
     while ((answerInput == string.Empty) || (answerInput == "-1")) 
     { 
      //This is asking the question to the user 
      Console.WriteLine("Enter your favorite animal: "); 
      //this is storing users input 
      userInput = Console.ReadLine(); 
      //using function to validate response 
      answerInput = letterFunc(userInput); 
     } 


    } 
    //Creating function to only allow letters and making sure it's not left blank. 
    private static string letterFunc (string validate) 
    { 
     //intializing empty string 
     string returnString = string.Empty; 
     //validating it is not left empty 
     if(validate.Length > 0) 
     { 
      //iterating through the passed string 
      foreach(char c in validate) 
      { 
       //using the asciitable to validate they only use A-Z, a-z, and space 
       if ((((Convert.ToInt32(c)) > 64) && ((Convert.ToInt32(c)) < 91)) || (((Convert.ToInt32(c)) > 96) && ((Convert.ToInt32(c)) < 123)) || (Convert.ToInt32(c) == 32)) 
       { 
        //appensing sanitized character to return string 
        returnString += c; 
       } 
       else 
       { 
        //If they try to enter a number this will warn them 
        Console.WriteLine("Invalid input. Use letters only."); 
       } 
      } 
     } 
     else 
     { 
      //If user enters a blank input, this will warn them 
      Console.WriteLine("You cannot enter a blank response."); 
     } 
     //returning string 
     return returnString; 
    } 

мне было интересно, если это возможно сделать это внутри функцию я создал, чтобы проверить их использовать только букву и что это не является пустым с подробным объяснением. Благодарю.

+0

Смотрите в регулярные выражения, это должно быть в состоянии делать то, что вы хотите – maccettura

+0

не являются регулярными выражения избыточны для выполнения этой задачи? Это ответ на один вопрос, если текст не содержит пробела, а 'char.IsUpper()' может проверить первую букву в верхнем регистре. – stuartd

+0

Я думаю, что ваш метод является избыточным по сравнению с RegExp. Кроме того, никогда, хотя я бы сказал это, но я думаю, что регулярные выражения будут более понятными, чем ваш текущий метод. =) –

ответ

0

Я понял. Спасибо всем за помощь.

 string answer; 
     while (true) 
     { 
      Console.WriteLine("Enter your favorite animal:"); 
      answer = Console.ReadLine(); 

      if (new Regex("^[A-Z][a-z]*$").IsMatch(answer)) 
      { 
       Console.WriteLine("You like {0}s. Cool!", answer); 
       Console.ReadKey(); 
       break; 
      } 
      else 
      { 
       Console.WriteLine("'{0}' is not a valid answer.", answer); 
       Console.WriteLine(); 
       Console.WriteLine("Make sure:"); 
       Console.WriteLine("You are entering a one word answer."); 
       Console.WriteLine("You are only using letters."); 
       Console.WriteLine("You are capitalizing the first letter of the word."); 
       Console.WriteLine(); 
       Console.WriteLine("Try again:"); 
      } 

     } 
1

Регулярные выражения не так уж трудны. Проблема заключается в том, что иногда вы хотите достичь чего-то более сложного, но это не ваш случай:

private static string letterFunc (string validate) 
{ 
    return new Regex("^[A-Z][a-z]*$").IsMatch(validate) ? 
      validate : 
      string.Empty; 
} 

Объясняя выражение:

^ - Якорь: только соответствует, когда текст начинается с выражением

[A-Z] - Точно один символ из к Z

[a-z]* - ноль или больше символов, от к г

$ - Якорь: только соответствует, когда текст заканчивается с выражением

с помощью двух якорей, мы хотим, чтобы в полной мере текст соответствует выражению, а не его частям.

Если вы хотите, чтобы капиталы после первой буквы (как CaT или DoG), вы можете изменить его на:

^[A-Z][a-zA-Z]*$

Play с Regex: https://regex101.com/r/zwLO6I/2

+1

Спасибо, что объяснил мне регулярное выражение. Теперь я могу понять, как это работает. Я определенно собираюсь попробовать это сейчас ... есть ли способ убедиться, что они только ввели одно слово для ответа, используя Regex? – Pandda

+1

На самом деле, неважно, я попробовал, и это потрясающе! Я определенно буду пытаться использовать Regex с этого момента. – Pandda

+0

Рад помочь, и добро пожаловать в переполнение стека. Если этот ответ или любой другой решают вашу проблему, отметьте его как принятый. –

1

Регулярные выражения бы быть стандартный способ сделать это, но, глядя на ваш код, я не думаю, что вы к ним готовы. Между прочим, это не оскорбление - каждый был новичком в какой-то момент!

Всякий раз, когда вы приближаетесь к проблеме, как это, сначала убедитесь, что все ваши требования четко определены и конкретные:

  • одно слово Ответ: В вашем коде, вы определили его как «ответ который содержит только буквы и пробелы ». Это может быть не идеально, поскольку это мешает людям вводить ответы, такие как dik-dik как их любимое животное. Но давайте придерживаться этого на данный момент.

  • Заглавный ответ: давайте определим это как «ответ, где первый символ является большой буквы».

Итак, принимая вместе два требования, мы пытаемся подтвердить, что ответ начинается с заглавной буквы и содержит только буквы и пробелы.

При кодировании ознакомьтесь с языком и каркасом, которые вы используете, чтобы узнать, есть ли удобные методы, которые могут вам помочь. У .NET есть много таких. Мы знаем, что нам нужно будет проверить отдельные символы String, а строка состоит из Char s, поэтому давайте укажем «C# char type». Глядя на MSDN page for System.Char, мы можем увидеть пару методов, которые могли бы помочь нам:

  • Char.IsWhiteSpace - тесты, является ли символ «пробел» (пробел, табуляция, перевод строки)
  • Char.IsLetter - проверяет, является ли это персонаж письмо.
  • Char.IsUpper - проверяет, является ли символ заглавной буквой.

Итак, давайте снова рассмотрим наши требования и реализуем их по одному: «начинается с заглавной буквы и содержит только буквы и пробелы».

Назовем строку ввода-вывода answer. Мы можем проверить, что первая буква заглавная, как это (обратите внимание, мы также убедитесь, что он имеет первую букву):

bool isCapitalized = answer.Length > 0 && Char.IsUpper(answer[0]); 

Мы можем проверить, что он содержит только буквы и пробелы, как это:

bool containsOnlyLettersAndSpaces = true; 
foreach(char c in answer) 
{ 
    if(!Char.IsLetter(c) && !Char.IsWhiteSpace(c)) 
    { 
     containsOnlyLettersAndSpaces = false; 
     break; 
    } 
} 

containsOnlyLettersAndSpaces начинается как истина. Затем мы смотрим на каждого символа в строке. Если мы найдем символ, который не является буквой И не является пробелом, мы устанавливаем containsOnlyLettersAndSpaces в значение false. Также, если мы обнаруживаем недопустимый символ, прекратите проверку. Мы знаем, что ответ недействителен сейчас, нет причин проверять его остальное!

Теперь мы можем вернуть наш ответ в виде комбинации двух валидаций:

return isCapitalized && containsOnlyLettersAndSpaces; 

Вот весь метод:

private bool IsValidAnimal(string answer) 
    { 
     bool isCapitalized = answer.Length > 0 && Char.IsUpper(answer[0]); 

     bool containsOnlyLettersAndSpaces = true; 
     foreach(char c in answer) 
     { 
      if(!Char.IsLetter(c) && !Char.IsWhiteSpace(c)) 
      { 
       containsOnlyLettersAndSpaces = false; 
       break; 
      } 
     } 

     return isCapitalized && containsOnlyLettersAndSpaces; 
    } 

Удачи обучения C#, и я надеюсь, что это помогло вам подумайте о том, как закодировать!

+0

Под «одним ответом» я имел в виду буквально только одно слово. ех. «Cat» и «заглавными буквами» я имел в виду, когда они вошли в «cat», он отображает ошибку, что она не заглавная (первая буква «cat» должна быть «Cat») И спасибо вам за понимание ! Я последовал и понял, что вы сделали. – Pandda