我有一个控制台应用程序,试图将其视为终端。甚至终端机也无法确保格式完美,但是我对这种事情有OCD的要求,并希望这样做。
一旦我在终端中输入了大约10或20行,我就到达了我的输入光标在控制台窗口底部的位置,并且下面没有空行。
我只是认为,如果所有行下面都有一行,情况会好得多。因此,在我的while循环之后,我尝试了此操作,但似乎并不能解决我当前面临的问题。
private static void PrintLineToBottom()
{
Console.WriteLine();
Console.SetCursorPosition(0, Console.CursorTop - 1);
}
有人可以在这里帮助吗?我想它还需要知道何时需要执行此操作。
答案 0 :(得分:0)
我认为您方法的唯一问题是它没有向控制台窗口写入任何内容。如果您添加一个参数并将其写入控制台,它应该可以按预期工作。
此示例使用默认值为object
的{{1}},但是您可以创建许多重载来模仿实际的null
方法。除了将参数打印到窗口外加上换行符,然后将光标向上移动一个空格外,它基本上与您拥有的代码相同。我还添加了一个可选参数来更改最后一行下方的空白行数:
WriteLine
然后,您将在代码中使用此方法代替private static void TerminalWriteLine(object output = null, int numBlankLinesBelow = 1)
{
// Don't allow negative numbers
numBlankLinesBelow = Math.Max(0, numBlankLinesBelow);
Console.WriteLine(output + new string('\n', numBlankLinesBelow));
Console.SetCursorPosition(Console.CursorLeft, Console.CursorTop - numBlankLinesBelow);
}
,例如:
Console.WriteLine
第一个private static void Main()
{
for (int i = 0; i < 100; i++)
{
TerminalWriteLine(i);
}
Console.ReadLine();
TerminalWriteLine("There should be 5 blank lines below this", 5);
Console.ReadLine();
}
之后的输出:
第二ReadLine()
后的输出:
答案 1 :(得分:0)
你好!
我只需要注册即可为您的问题提供一个真实,正确的答案。
没有参数的WriteLine()可以100%正常运行,并且不会引起问题。对
如果您希望将代码保持私密性,最好*将代码重新创建为摘录,如下所示。
正确答案是最简单的。复制并粘贴,然后使用它。
while (true)
{
Console.WriteLine(">");
Console.CursorTop--;
Console.CursorLeft++;
string input = Console.ReadLine();
}
在这一点上,它得到了答案。
但是让我们将其分解并享受一些乐趣吧!
打印提示字符串(“>”),或不打印任何内容(),然后根据需要转到下一行。
Console.WriteLine(">"); // Or...
Console.WriteLine(); // Blank prompt.
有时候无法知道目标位置。
Console.CursorTop--; // Cursor up by 1.
Console.CursorLeft++; // Right by length of prompt, if not blank.
“ _”代表光标位置。
>_ // Prompt awaiting user input.
此时可以捕获用户输入。
string input = Console.ReadLine();
模糊。
我很奇怪,因为我最喜欢命令提示符控制台应用程序。在过去的几年中,我做了很多工作,直到本月才创建了我的最新版本,其中最简单的 omg 和绝对最佳的功能-100%作为Cmd.exe运行,但现在具有添加自定义命令的前端功能,因此默认情况下为Cmd.exe。
我最复杂的版本(以前的版本)具有惊人的自定义功能,包括将Terminal变成文字终端的功能。该终端还具有“退出”命令,可将您带回到我的控制台。
这实际上是我最大的编程爱好之一。这样一来,迅速而感叹地看到一个充满可怕的非答案的页面。
因此...
在控制台中,我总是使用Write函数,因为我不希望在下面出现空白行。
写入还可以为您提供更多控制。 让我们充满活力!
while (true)
{
string prompt = "Terminal> ";
Console.Write(prompt);
int count = 5;
for (int i = 0; i < count; i++) Console.WriteLine();
Console.CursorTop -= count;
Console.CursorLeft += prompt.Length;
string input = Console.ReadLine();
}
现在,我们希望提示字符串是一个变量。
string prompt = "Terminal> "; // Notice the space.
Console.Write(prompt);
我们可以在此处确定所需的空白行,也可以从外部确定。
int count = 5; // Or variable.
一个简单的for循环,可在每次提示后为我们提供所需数量的空白行。
这就是为什么我们不提示WriteLine的原因,因为这样会给我们额外的提示。
for (int i = 0; i < count; i++) Console.WriteLine();
根据我们已知的大小上下移动光标。
Console.CursorTop -= count; // Blank lines we printed.
Console.CursorLeft += prompt.Length; // The string length of the prompt.
“ _”代表光标位置。
Terminal> _ // Prompt awaiting user input.
此时可以捕获用户输入。
string input = Console.ReadLine();
这是我的代码的样子。复制并粘贴此功能,玩得开心!
static void CommandPrompt()
{
string input = "";
string promptString = "Terminal> ";
int blankLinesCount = 1;
while (true) PromptLoop();
// Local functions are a thing.
string PromptSimple()
{
Console.Write(">");
return Console.ReadLine();
}
string Prompt()
{
Console.Write(promptString);
for (int i = 0; i < blankLinesCount; i++) Console.WriteLine();
Console.CursorTop -= blankLinesCount;
Console.CursorLeft += promptString.Length;
return Console.ReadLine();
}
void PromptLoop()
{
input = Prompt();
// Process the input.
}
}
享受! ♥