1

私はひどくプログラミングの割り当てを試みています。私は「これがあなたのやり方です」ではなく、「私が間違っていることは何ですか?」を探しています。

文字列入力から各文の先頭を大文字にしようとしています。たとえば、「こんにちは。私の名前はジョンです。自転車に乗るのが好きです。」という文字列です。文字列を変更して、大文字で返します。たとえば、「こんにちは。私の名前はジョンです。自転車に乗るのが好きです。」私の論理は少し欠陥があるようで、私は非常に迷っています。

私がこれまでに持っているものを以下に示します。基本的に私がしているのは、文の終わりを意味する句読点をテストすることだけです。そして、キャラクターを置き換えようとしています。また、IndexOutOfRange例外を作成しないように、文字列の最後にあるかどうかをテストします。しかし、私が得ているのはそれだけです:(

private string SentenceCapitalizer(string input)
    {
        for (int i = 0; i < input.Length; i++)
        {
            if (input[i] == '.' || input[i] == '!' || input[i] == '?')
            {
                if (!(input[i] == input.Length))
                {                       
                    input.Replace(input[i + 2], char.ToUpper(input[i + 2]));  
                }                     
            }
        }

        return input;

    }

どんな助けでも大歓迎です。私はC#を学んでいるだけなので、最も基本的なヘルプはサービスです。よくわからない:P

4

4 に答える 4

3

それ以外の

if (!(input[i + 2] >= input.Length))

そのはず

if (!(i + 2 >= input.Length))

文字ではなくインデックスを比較しています

于 2013-03-19T06:32:56.873 に答える
1

現在のインデックスが文字列の長さ以下であるかどうかを確認してから、インデックス2をさらに変更しようとしています。

    if (!(input[i] == input.Length))
            {                       
                input.Replace(input[i + 2], char.ToUpper(input[i + 2]));  
            } 

に変更する必要があります

    if (!((i + 2) >= input.Length))
            {                       
                input.Replace(input[i + 2], char.ToUpper(input[i + 2]));  
            } 

これにより、句読点の2桁後に値があることが確認されます。また、2をジャンプしているので、==ではなく> =を使用すると、配列の長さを超えてしまう可能性があります。ここで、==はfalseを返しますが、インデックスはありません。

于 2013-03-19T06:20:28.267 に答える
1

文字列は不変です。次のことはできません。

var str = "123";
str.Replace('1', '2');

あなたはしなければならない:

var str = "123";
str = str.Replace('1', '2');
于 2013-03-19T07:02:47.627 に答える
0

わかりました、他の人が明らかなエラーを止めるためのいくつかの指針をあなたに提供しましたが、これをどのように実装するのが最善かについていくつかの考えを与えようとします.

これを 3 ステップのプロセスとして考える価値があります。

  1. 文字列を文にトークン化する
  2. 各トークンの最初の文字が大文字であることを確認してください
  3. トークンを結合して文字列を再構築する

(1) ご想像にお任せしますが、アイデアは、要件に応じて各要素が「文」を表す文字列の配列になることです

(2) 次のように非常に単純です。

// Upercase character 0, and join it to everything from character 1 onwards
var fixedToken = token[0].ToUpper(CultureInfo.CurrentCulture) 
                              + token.Substring(1);

(3) シンプルでもある

// reconstruct string by joining all tokens with a space
var reconstructed = String.Join(" ",tokens);
于 2013-03-20T16:48:25.740 に答える