2016-06-22 3 views
-2

Хорошо, поэтому, в моей операционной системе C# Cosmos, я работаю над системой, которая позволяет мне вводить строку и желаемую ширину и переносить строку в строки по ширине.Почему этот скриптовый обертывающий алгоритм C# не работает?

Он работает примерно так: строка ввода «Hello beautiful world». Ширина равна 6. Алгоритм будет перебирать строку, и если индекс символа равен ширине, а текущий символ - это пробел, он будет принимать все от начала строки до этой точки, добавить ее в список и удалить его из самой строки и сбросить индекс char до 0 и начать заново. Он делает это до тех пор, пока строка не станет пустой или меньше ширины. Если он меньше ширины, он добавляется в список, и цикл for завершается. В миряне, наша строка вывода должна выйти так:

Здравствуйте
красивый
мир.

Это мой код.

Дело в том, что иногда, если мне приходится иметь дело с тем, что строка меньше ширины, мы получаем проблемы. Кажется, он пропускает эту часть строки. Хлоп!

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

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 
      { 

      } 
     } 
    } 

Pretty simple. Начинается с ширины по умолчанию 25 символов, и если заголовок больше, он задает длину заголовка. Если длина текста меньше ширины, он устанавливает ширину для компенсации. Затем он вызывает вызов алгоритма сплиттера сверху, найденного в «TUI.Utils», а затем делает некоторые вещи для печати на экране.

Вот часть «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 –

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