2016-06-22 34 views
-2

さて、私のC#Cosmosオペレーティングシステムでは、文字列と希望の幅を入力し、その幅に基づいて文字列を行にラップするシステムに取り組んでいます。なぜこのC#文字列ラッピングアルゴリズムは機能しませんか?

これは次のように機能します:入力文字列は "Hello beautiful world"です。 widthは6です。アルゴリズムは文字列を反復処理し、charインデックスがwidthのもので、現在のcharがSpaceの場合、文字列の先頭からそのポイントまでのすべてを取ります。リストを作成し、それを文字列自体から削除し、charインデックスを0にリセットしてやり直してください。これは、文字列が空であるか幅よりも小さくなるまで行います。幅よりも小さい場合は、リストに追加され、forループが終了します。素人では、私たちの出力文字列は次のように出てくるはずです。

こんにちは
美しい
世界。

これは私のコードです。

public static List<string> split_string(int width, string text) 
    { 
     List<string> text_lines = new List<string>(); 
     //Separate lines of text. 
     for (int i = 0; i < text.Length; i++) 
     { 
      if (text.Length <= width) 
      { 
       text_lines.Add(text); 
       i = text.Length + 5; 
      } 
      else 
      { 
       if (i >= width) 
       { 
        if (text[i] == ' ') 
        { 
         text_lines.Add(text.Substring(0, i + 1)); 
         text = text.Remove(0, i + 1); 
         i = 0; 
        } 
       } 
      } 
     } 
     return text_lines; 
    } 

事は、私は、文字列の幅よりも小さいことに対処することに終わるならば、我々は問題を取得し、時々、です。それは文字列のその部分をスキップするようです。 Yikes!

たとえば、これを使用する私のOSがあります。タイトルとメッセージを取ってOKボタン付きのメッセージボックスに表示することになっています。

public static void ShowMessagebox(string title, string text) 
    { 
     int splitWidth = 25; 
     if(text.Length < splitWidth) 
     { 
      splitWidth = text.Length; 
     } 
     if(title.Length > splitWidth) 
     { 
      splitWidth = title.Length; 
     } 
     var lines = new List<string>(); 
     if(splitWidth > text.Length) 
     { 
      lines.Add(text); 
     } 
     else 
     { 
      lines = TUI.Utils.split_string(splitWidth, text); 
     } 
     foreach(var line in lines) 
     { 
      if(text.Contains(line)) 
      { 
       text = text.Replace(line, ""); 
      } 
     } 
     if(text.Length > 0) 
     { 
      lines.Add(text); 
     } 
     int h = lines.Count + 4; 
     int w = 0; 
     foreach(var line in lines) 
     { 
      if(line.Length + 4 > w) 
      { 
       w = line.Length + 4; 
      } 
     } 
     int x = (Console.WindowWidth - w)/2; 
     int y = (Console.WindowHeight - h)/2; 
     TUI.Utils.ClearArea(x, y, w, h, ConsoleColor.Green); 
     TUI.Utils.ClearArea(x, y, w, 1, ConsoleColor.White); 
     TUI.Utils.Write(x + 1, y, title, ConsoleColor.White, ConsoleColor.Black); 
     for(int i = 0; i < lines.Count - 1; i++) 
     { 
      TUI.Utils.Write(x + 2, (y + 2) + i, lines[i], ConsoleColor.Green, ConsoleColor.White); 
     } 
     int xw = x + w; 
     int yh = y + h; 
     TUI.Utils.Write(xw - 6, yh - 2, "<OK>", TUI.Utils.COL_BUTTON_SELECTED, TUI.Utils.COL_BUTTON_TEXT); 
     bool stuck = true; 
     while (stuck) 
     { 
      var kinf = Console.ReadKey(); 
      if (kinf.Key == ConsoleKey.Enter) 
      { 
       stuck = false; 
       Console.Clear(); 
      } 
      else 
      { 

      } 
     } 
    } 

かなり簡単です。デフォルトの幅は25文字で始まり、タイトルが大きい場合はタイトル長に設定されます。テキストの長さが幅よりも小さい場合は、補正する幅を設定します。次に、 'TUI.Utils'にある上のスプリッタアルゴリズムを呼び出すと、画面に印刷するためのいくつかの処理が行われます。

私のOSの「ConfigurationManager」は、ユーザーの入力を受け取り、それを使って設定ファイルを生成するアプリケーションです。今すぐ仕事が進行中です。

    Curse.ShowMessagebox("Memphis can't run properly this system.", "Memphis needs at least one FAT partition on a Master Boot Record to be able to store it's configuration and other files on. Please use a partition utility like GParted to partition your hard drive properly."); 

しかし、私の画面上に出て来るものを見て

...

The messagebox coming out of the above method call

あなたが見ることができるように、本当に私が欲しいもの。それは文字列のいくつかを欠いている!

+0

は、あなただけの最後に残された任意の文字列がありますかどうかを確認する必要があります提供しますy私たちのループと残りの部分を(もしあれば)リストに追加します。 – itsme86

答えて

2

textを変更する必要はありません。元の部分文字列のオフセットを保存するだけです。私たちが行う文字列操作が少ないほど良いでしょう。

public static List<string> split_string(int width, string text) 
{ 
    width = width - 1; //So we're not constantly comparing to width - 1 
    var returnSet = new List<string>(); 
    var currLength = 0; 
    var oldOffset = 0; 
    for (var i = 0; i < text.Length; i++) 
    { 
     if (currLength >= width && text[i] == ' ') 
     { 
      returnSet.Add(text.Substring(oldOffset, i - oldOffset)); 
      oldOffset = i + 1; 
      currLength = 0; 
      continue; 
     } 
     currLength++; 
    } 
    if (oldOffset < text.Length) 
     returnSet.Add(text.Substring(oldOffset)); 

    return returnSet; 
} 

テスト:

split_string(25, "Memphis needs at least one FAT partition on a Master Boot Record to be able to store it's configuration and other files on. Please use a partition utility like GParted to partition your hard drive properly."); 

は与える:

 
Memphis needs at least one 
FAT partition on a Master 
Boot Record to be able to 
store it's configuration 
and other files on. Please 
use a partition utility like 
GParted to partition your 
hard drive properly. 
split_string(6, "Hello beautiful world.") 

 
Hello 
beautiful 
world. 
+0

このアルゴリズムがCosmos内で動作するかどうかを見てみましょう。そうであれば、私は答えとして何かをマークする方法がわからないので、あなたに感謝の気持ちは分かりませんxD –

関連する問題