53

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

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

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

4

8 回答 8

77

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

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

输出“AbDef”;

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

Console.Write("\b \b");
于 2011-03-04T15:33:46.873 回答
48

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

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

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

于 2014-06-25T09:13:20.917 回答
18

如果您使用Write而不是WriteLine.

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

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

于 2011-03-04T15:35:09.863 回答
7

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

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

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

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

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

于 2018-12-30T10:30:17.973 回答
6

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

Console.SetCursorPosition(Console.CursorLeft - 1, Console.CursorTop);又一次Console.Write()

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

于 2014-05-20T19:47:22.180 回答
3

除非您通过 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");
于 2014-04-22T19:01:39.650 回答
1

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

于 2011-03-04T15:33:53.253 回答
1

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

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);
}
于 2020-06-21T19:27:17.693 回答