Почему только первое слово пишется с заглавной буквы при использовании функции tocap ()? - PullRequest
1 голос
/ 06 января 2009

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

static void Main(string[] args)
{
    string s = "how u doin the dnt know about medri sho min shan ma baref shu";
    string a = tocap(s);
    Console.WriteLine(a);
}

public static string tocap(string s)
{    
    if (s.Length == 1) return s.ToUpper();
    string s1;
    string s2;

    s1 = s.Substring(0, 1).ToUpper();
    s2 = s.Substring(1).ToLower();

    return s1+s2;
}

Ответы [ 6 ]

13 голосов
/ 06 января 2009

Так как ни один профессор не принял бы это решение, я чувствую себя прекрасно, позволяя кому-либо погуглить это, что вы можете просто использовать ToTitleCase

10 голосов
/ 06 января 2009

Полагаю, вам станет лучше, если вы действительно поймете, что делаете:

   public static string tocap(string s)
    {

        // This says: "if s length is 1 then returned converted in upper case" 
        // for instance if s = "a" it will return "A". So far the function is ok.
        if (s.Length == 1) return s.ToUpper();


        string s1;
        string s2;

        // This says: "from my string I want the FIRST letter converted to upper case"
        // So from an input like s = "oscar" you're doing this s1 = "O"
        s1 = s.Substring(0, 1).ToUpper();


        // finally here you're saying: "for the rest just give it to me all lower case"
        // so for s= "oscar"; you're getting "scar" ... 
        s2 = s.Substring(1).ToLower();


        // and then return "O" + "scar" that's why it only works for the first 
        // letter.
        return s1+s2;
    }

Теперь вам нужно изменить алгоритм (а затем и ваш код) на то, ЧТО вы собираетесь делать

Вы можете «разбить» вашу строку на части, где найден пробел, ИЛИ вы можете перейти к каждому символу, и когда вы найдете пробел, вы знаете, что следующая буква будет началом слова, не так ли?

Попробуйте этот алгоритм-псевдо-код

inside_space = false // this flag will tell us if we are inside 
                     // a white space.

for each character in string do


    if( character is white space ) then 
         inside_space = true // you're in an space...
                             // raise your flag.


     else  if( character is not white space AND 
               inside_space == true ) then 

           // this means you're not longer in a space 
           // ( thus the beginning of a word exactly what you want ) 

          character = character.toUper()  // convert the current 
                                          // char to upper case

          inside_space = false;           // turn the flag to false
                                          // so the next won't be uc'ed
     end

     // Here you just add your letter to the string 
     // either white space, upercased letter or any other.

     result =  result + character 

 end // for

Подумай об этом.

Вы будете делать то, что хотите:

  • Go буква за буквой и

  • если вы находитесь в пространстве, вы ставите флаг,

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

  • В остальном вы просто добавляете письмо к результату.

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

9 голосов
/ 06 января 2009

Научитесь любить метод string.split().

Больше помощи, чем это, и я чувствую себя грязным.

4 голосов
/ 06 января 2009

Попробуйте использовать:

System.Globalization.TextInfo.ToTitleCase

1 голос
/ 06 января 2009

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

1 голос
/ 06 января 2009

Вам как-то нужно токенизировать вашу исходную строку. В настоящее время вы даже не смотрите мимо первого персонажа всего этого.

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