为什么控制台应用程序的底部总是空白行?

时间:2018-08-22 21:32:32

标签: c# .net

我有一个控制台应用程序,试图将其视为终端。甚至终端机也无法确保格式完美,但是我对这种事情有OCD的要求,并希望这样做。

一旦我在终端中输入了大约10或20行,我就到达了我的输入光标在控制台窗口底部的位置,并且下面没有空行。

我只是认为,如果所有行下面都有一行,情况会好得多。因此,在我的while循环之后,我尝试了此操作,但似乎并不能解决我当前面临的问题。

private static void PrintLineToBottom()
{
    Console.WriteLine();
    Console.SetCursorPosition(0, Console.CursorTop - 1);
}

有人可以在这里帮助吗?我想它还需要知道何时需要执行此操作。

2 个答案:

答案 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(); } 之后的输出:

![enter image description here

第二ReadLine()后的输出:

![enter image description here

答案 1 :(得分:0)

你好!

我只需要注册即可为您的问题提供一个真实,正确的答案。

没有参数的WriteLine()可以100%正常运行,并且不会引起问题。对 Rufus L 很抱歉。

  • 不应在循环后调用您的函数。直到您中断循环,它才会被调用。
  • 这就是我在没有更多代码为您的单词赋予上下文的情况下所能说的。

如果您希望将代码保持私密性,最好*将代码重新创建为摘录,如下所示。


正确答案是最简单的。复制并粘贴,然后使用它。

        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.
        }
    }

享受! ♥