2015-10-02 4 views
0

Я пытаюсь определить, является ли первый символ строки «предложение» капиталом или нет. Программа работает нормально, но тестовый прогон дает индекс массива вне диапазона. Я не могу понять проблему.Определить, является ли первый символ строки верхним или нижним

public class CapitalOrNot 
{ 
    public static void Main() 
    { 
     string sentence = "Asdafasda"; 
     string UpOrLow = UpperOrLower(sentence); 
     Console.WriteLine("First char is " + UpOrLow); 
    } 

    public static string UpperOrLower(string mj) 
    { 
     if (char.IsUpper(mj[0])) 
     { 
      mj = "upper"; 
     } 
     else mj = "lower"; 

     return mj; 
    } 
} 
+3

работает для меня: http://ideone.com/Pft0pL и это был прямой копией пасты – BradleyDotNET

+5

Может быть, ваш тест кормления вам пустую строку? Это вызовет 'mj [0]', чтобы выбросить эту ошибку. – doogle

+0

Код работает нормально; http://csharppad.com/gist/34ac6b62a620acefb634 – Hozikimaru

ответ

3

Вы должны проверить, если строка пуста:

public static string UpperOrLower(string mj) 
{ 
    if (string.IsNullOrEmpty(mj)) 
     return "bad input"; 

    return char.IsUpper(mj[0]) ? "upper" : "lower"; 
} 
+0

Для меня 'string.Any()' действительно странный способ не использовать 'string.IsNullOrEmpty()'. Имеет ли он какие-либо преимущества? –

+1

Я бы не сказал, что есть польза. Я согласен: 'IsNullOrEmpty' лучше понимает точку и добавляет нулевую проверку. – Jonesopolis

+0

Это сделало трюк. Я действительно думал об IsNullOrEmpty, но не знал, как воспользоваться этим. Большое спасибо!! – user1775611

0

Как насчет этого?

public class CapitalOrNot 
{ 
    public static void Main() 
    { 
     string sentence = "Asdafasda"; 

     if(sentence.Length > 0 && sentence != null) 
     { 
      string UpOrLow = UpperOrLower(sentence); 
      Console.WriteLine("First char is " + UpOrLow); 
     } 
     else 
     { 
      Console.WriteLine("You did not input a sentence"); 
     } 
    } 

    public static string UpperOrLower(string mj) 
    { 
     if (char.IsUpper(mj[0])) 
     { 
      mj = "upper"; 
     } 
     else mj = "lower"; 

     return mj; 
    } 
} 
+0

Я не могу изменить основную программу, так как это онлайн-программа на моем веб-сайте университета. Мне просто нужно закодировать подпрограмму. – user1775611

+0

Должно ли 'предложение.Лифт> 0 && предложение! = Null' заменяться на' string.IsNullOrEmpty (предложение) '? –

+1

Да, это лучше .... Я бы использовал 'string.IsNullOrEmpty (предложение)', поскольку он по существу делает то же самое, но лучше. –

0

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

public static string UpperOrLower(string mj) 
    { 
     if (string.IsNullOrEmpty(mj)) 
     { 
      if (char.IsUpper(mj[0])) 
      { 
       mj = "upper"; 
      } 
      else mj = "lower"; 
     } 
     else 
     { 
      mj = "empty"; 
     } 
     return mj; 
    } 

С уважением.

+0

null идет стрела :-( – Joe

+0

Вы правы, давайте исправим это!;) Спасибо – Alba

1

Решение с использованием нуль условного оператора:

public static string UpperOrLower(string str) 
{ 
    return (str?.Any()).GetValueOrDefault() ? (Char.IsUpper(str.First()) ? "upper" : "lower") : "bad input"; 
} 
+0

nice ... зачем использовать локальную переменную, когда вы можете просто вернуть результаты, которые вы хотите. – Joe

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