2016-11-23 12 views
-3

になります。コードの目的は、2つ以上のスペースがある位置を削除し、1つのスペースで置き換えることです。int variable = sentence.Lengthは機能しませんが、sentence.Lengthは

static void Main(string[] args) 
    { 
     string sentence = Console.ReadLine(); 
     int size = Convert.ToInt16(sentence.Length); 

     for (int i = 0; i < size - 1; i++) 
     { 
      sentence = sentence.Trim(); 
      while ((sentence[i] == ' ') && (sentence[i+1] == ' ')) 
      { 
       sentence = sentence.Remove(i + 1, 1); 
      } 
     } 

     Console.WriteLine(sentence); 
     Console.ReadLine(); 
    } 

何らかの理由で、2つ以上のスペースをスローすると、このコードは機能しません。 しかし、これは上記のsize変数の代わりにsentence.Lengthを使用すると動作します。

static void Main(string[] args) 
    { 
     string sentence = Convert.ToString(Console.ReadLine()); 
     for (int i = 0; i < sentence.Length - 1; i++) 
     { 
      while ((sentence[i] == ' ') && (sentence[i + 1] == ' ')) 
      { 
       sentence = sentence.Remove(i + 1, 1); 
      } 
     } 
     Console.WriteLine("Sentence:{0}", sentence); 
     Console.ReadLine(); 
    } 

なぜ最初のスニペットは機能しませんか。

+4

デバッガを使用してコードをステップ実行します。 – zerkms

+1

途中であなたの 'Convert'呼び出しのどれも必要ありません – Setsu

答えて

0

= sentence.Length - 1のでi + 1最大値をsentence.Length - 1ので、意志文字列から文字を削除すると、それに応じて文字列のサイズが増減します。ループの前にsize - 1が固定されていて、Index was outside the bounds of the array.が返ってくるのですが、最初の場合はエラーが発生します。しかし、2番目のケースでは、プログラムは正常に実行されます。

ドライランは、プログラムが入力を受け取り、デバッガのようにループ内のすべてのステップを実行するときに何が起きるかを確認できる手法です。

+0

ありがとうございました! =)) – Clarity

+0

@ Clarity:私はそれが気に入って、あなたが理解してうれしいです。 –

0

それが壊れる理由は、あなたの最初のコードブロック内の行です:sentence = sentence.Trim();

あなたは追加のスペースの場合には、あなたの文字列の長さを変更している、まだループは、まだサイズ変数が先に設定されています。あなたがタイプすると:'test 'そしてサイズは6ですが、実際のサイズは4つまりtestになります。したがって、アクセスしようとすると、例外外の例外がスローされます:sentence[5]

希望は意味があります。

EDIT:int size = Convert.ToInt16(sentence.Length);サイズを設定しているときに、実際の文章のサイズが表示されます。

それはあなたがこれを行う2番目のコードブロックでsize + 1 に行くことになります私たちのこのようi + 1による境界の行くために(sentence[i] == ' ') && (sentence[i+1] == ' ')が発生します:sentence.Length

+0

答えをありがとう!しかし、文章を削除した後でさえ。トリム(); 、コードはまだ動作しません=( ConsoleApplication6.exeで 'System.IndexOutOfRangeException'型の未処理例外が発生しました – Clarity

+0

私の回答が – JanR

+3

に更新されました 'sentence = sentence.Remove(i + 1、1)'は長さも変更します –

0

は、最初のスニペットを考えてみましょう:

あなたが気づくする必要がある最初の事は、あなたがint size = sentence.Lengthを使用することができますConvert.ToInt16()を使用して整数として再びそれを変換する必要がないのでsentence.Lengthは、あなたの整数値を与えるです。

入力を"this is sample"とし、文字列の長さを16に2つの空白を追加します。最初の追加スペースを削除すると、inputStringの長さは15になりました。つまり、ループの最後の反復で例外がスローされます.2番目のスペースを削除すると、最後の2番目の反復でIndexOutOfRangeExceptionが返されます。だから、これはこれを行う良い方法ではありません。

削除する必要のある文字のインデックスを保持し、入力文字列から削除するための2番目のループを作成する方が良い。

+0

私は確かにそのアプローチを試みるだろう、私はそれを覚えていないとは信じられない。どうもありがとうございます! – Clarity

+0

彼のコンバージョンにも欠陥があります。彼は32ビット整数を16ビット整数に変換し、32ビット整数に戻します。つまり、ビットの半分が失われる可能性があります。 – Bauss

関連する問題