【问题标题】:Is there a way to delete a character that has just been written using Console.WriteLine?有没有办法删除刚刚使用 Console.WriteLine 写入的字符?
【发布时间】:2011-03-04 15:26:50
【问题描述】:

有没有办法从控制台中删除最后一个字符,即

Console.WriteLine("List: apple,pear,");
// Somehow delete the last ',' character from the console.
Console.WriteLine(".");
// Now the console contains "List: apple,pear."

当然,我可以先创建一个字符串,然后将其打印到控制台,但我只是想知道是否可以直接从控制台删除字符。

【问题讨论】:

  • 顺便说一句,如果你使用string.Join 方法,那么你就不用担心最后那个多余的逗号了。 Console.WriteLine("List: " + string.Join(",", fruitArray) + ".");

标签: c# console console-application console.writeline


【解决方案1】:

"\b" 是 ASCII 退格。打印它以备份一个字符。

Console.Write("Abc");
Console.Write("\b");
Console.Write("Def");

输出“AbDef”;

正如 Contango 和 Sammi 所指出的,有时需要用空格覆盖:

Console.Write("\b \b");

【讨论】:

  • 谢谢,这很好用。感谢您的回答 - 这是难以找到答案的问题之一,因为它很难找到明确的搜索字词。
  • 刚刚意识到,如果你在 \b 之后直接换行,它不起作用 - 你必须添加一个空格来“覆盖”流氓字符。 \b 控制光标,它更像是一个左箭头键而不是退格键。
  • 其实 '\b' 只在当前行有效。您无法覆盖上一行中的字符。
【解决方案2】:

Console.Write("\b \b"); 可能是你想要的。它删除最后一个字符并将插入符号移回。

\b 退格转义字符仅将插入符号向后移动。它不会删除最后一个字符。所以Console.Write("\b"); 只将插入符号向后移动,最后一个字符仍然可见。

Console.Write("\b \b"); 然而,首先将插入符号向后移动,然后写入一个空白字符,覆盖最后一个字符并再次向前移动插入符号。所以我们写了第二个\b 再次将插入符号移回。现在我们已经完成了退格按钮通常所做的事情。

【讨论】:

    【解决方案3】:

    如果您使用Write 而不是WriteLine,这将起到作用。

    Console.Write("List: apple,pear,");
    Console.Write("\b");  // backspace character
    Console.WriteLine(".");
    

    但实际上您对控制台有很多控制权。您可以写信到您希望的任何位置。只需使用Console.SetCursorPosition(int, int) 方法即可。

    【讨论】:

    • 谢谢,我不知道 Console.SetCursorPosition 方法。
    【解决方案4】:

    要删除控制台上的字符,请使用

    Console.Write("\x1B[1D"); // Move the cursor one unit to the left
    Console.Write("\x1B[1P"); // Delete the character
    

    这将正确删除光标之前的字符并将所有后面的字符移回。 使用下面的语句,您只会将光标前的字符替换为空格,而不会真正删除它。

    Console.Write("\b \b");
    

    我提出的解决方案应该也适用于一些其他编程语言,因为它使用的是 ANSI 转义序列。

    【讨论】:

    • 欢迎来到 Stack Overflow!投票给你,因为这是一个很好的替代答案。我确实认为这两个答案是等效的,因为从用户的角度来看,删除一个字符并用空格覆盖它可能是同一件事。
    【解决方案5】:

    如果你只想删除一个字符,你可以使用:

    Console.SetCursorPosition(Console.CursorLeft - 1, Console.CursorTop);Console.Write() 再次。

    如果您想删除多个字符,例如自动化,您可以将当前的Console.CursorLeft 存储在一个变量中,并在循环中使用Console.SetCursorPosition(--variablename, Console.CursorTop) 中的值来删除您想要的许多字符!

    【讨论】:

    • 这个答案比使用 ANSI 字符更好。可读性更好。
    【解决方案6】:

    除非您通过 for 或 foreach 循环进行迭代,否则上述解决方案非常有效。在这种情况下,您必须使用不同的方法,例如

     Console.SetCursorPosition(Console.CursorLeft - 1, Console.CursorTop);
     Console.WriteLine(" ");
    

    它确实有效,但也适用于字符串连接。

    例子:

    List<int> myList = new List<int>() { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };
    
    for (int i = 0; i < myList.Count; i++)
    {
        Console.Write(myList[i] + ", ");
    }
    
    Console.WriteLine("\b\b"); //this will not work.
    
    foreach (int item in myList)
    {
        Console.Write(item + ", ");
    }
    
    //this will work:
    Console.SetCursorPosition(Console.CursorLeft - 2, Console.CursorTop);
    Console.WriteLine("  ");
    
    //you can also do this, btw
    Console.WriteLine(string.Join(", ", myList) + "\b\b");
    

    【讨论】:

    • 这不是很安全...如果你在一个新行上(Console.CursorLeft = 0),这会抛出一个异常。
    • 我想具体来说,您需要更像 Console.SetCursorPosition((Console.CursorLeft - 2 + Console.WindowWidth) % Console.WindowWidth, Console.CursorLeft - 2
    【解决方案7】:

    您可以清除控制台,然后写入新的输出。

    【讨论】:

    • 我认为如果控制台应用程序涉及更多,这个解决方案就不能很好地扩展;您必须保留要打印和重印多次的缓冲区。
    【解决方案8】:

    如果你想继续写到同一行,
    覆盖旧行内容,而不是创建新行,
    你也可以简单地写:

    Console.Write("\r"); //CR char, moves cursor back to 1st pos in current line
    Console.Write("{0} Seconds...)", secondsLeft);
    

    所以如果你想从 10 倒数到 0,然后继续,如果会这样:

    for (var i = 10; i > 0; i--)
    {
        Console.Write("\r");
        Console.Write("{0} seconds left...{1}", i, i == 1 ? "\n" : "");
        Thread.Sleep(1000);
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-05-21
      • 2020-02-19
      • 2011-12-06
      • 1970-01-01
      • 2015-06-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多