Хорошо, поэтому, в моей операционной системе 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
Как вы можете видеть, на самом деле не вещь, которую я хочу. В нем отсутствует часть строки!
Вам просто нужно увидеть, если есть какая-либо строка, оставшиеся в конце Y наш цикл и добавьте остаток (если он есть) в список. – itsme86