Есть ли способ удалить только что написанный символ с помощью Console.WriteLine?

Есть ли способ удалить последний символ из консоли, т.е.

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

Конечно, я мог бы сначала создать строку, а затем вывести ее на консоль, но мне просто любопытно посмотреть, смогу ли я удалять символы прямо из консоли.


person Contango    schedule 04.03.2011    source источник
comment
Кстати, если вы используете метод string.Join, то вам не придется беспокоиться об этой лишней запятой в конце. Console.WriteLine("List: " + string.Join(",", fruitArray) + ".");   -  person Jeffrey L Whitledge    schedule 04.03.2011


Ответы (8)


"\b" - это возврат ASCII. Распечатайте его, чтобы создать резервную копию одного символа.

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

выводит "AbDef";

Как указали Контанго и Самми, бывают случаи, когда требуется перезапись пробелом:

Console.Write("\b \b");
person John Arlen    schedule 04.03.2011
comment
Спасибо, это работает отлично. Я ценю ваш ответ - это одна из тех проблем, на которые трудно найти ответ, поскольку трудно найти недвусмысленные условия поиска. - person Contango; 04.03.2011
comment
Только что понял, что если вы сделаете новую строку сразу после \b, это не сработает - вам нужно добавить пробел, чтобы перезаписать мошеннический символ. \b управляет курсором, это больше похоже на клавишу со стрелкой влево, чем на клавишу возврата. - person Contango; 04.03.2011
comment
На самом деле '\b' будет работать только в текущей строке. Вы не можете переопределить символы в предыдущей строке. - person Mr. Ree; 10.07.2015

Console.Write("\b \b");, вероятно, то, что вы хотите. Он удаляет последний символ и перемещает каретку назад.

Экранирующий символ возврата назад \b перемещает каретку только назад. Он не удаляет последний символ. Таким образом, Console.Write("\b"); перемещает каретку только на одну позицию назад, оставляя последний символ видимым.

Однако Console.Write("\b \b"); сначала перемещает каретку назад, затем записывает пробел, который перезаписывает последний символ, и снова перемещает каретку вперед. Поэтому мы пишем второй \b, чтобы снова переместить каретку. Теперь мы сделали то, что обычно делает кнопка Backspace.

person Sammi    schedule 25.06.2014

Это сработает, если вы используете Write вместо WriteLine.

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

Но на самом деле у вас есть большой контроль над консолью. Вы можете писать в любое удобное для вас место. Просто используйте метод Console.SetCursorPosition(int, int).

person Jeffrey L Whitledge    schedule 04.03.2011
comment
Спасибо, я не знал о методе Console.SetCursorPosition. - person Contango; 04.03.2011

если вы хотите удалить только один символ, вы можете использовать:

Console.SetCursorPosition(Console.CursorLeft - 1, Console.CursorTop); и Console.Write() еще раз.

если вы хотите удалить более одного символа, например, автоматизацию, вы можете сохранить текущий Console.CursorLeft в переменной и использовать это значение в Console.SetCursorPosition(--variablename, Console.CursorTop) в цикле, чтобы удалить много символов, которые вы хотите!

person Luciano Santesso    schedule 20.05.2014
comment
Этот ответ лучше, чем играть с символами ANSI. Он лучше читается. - person Mert Gülsoy; 12.05.2020

Чтобы удалить персонажа на консоли, используйте

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

Это правильно удалит символ перед курсором и переместит все последующие символы назад. Используя приведенный ниже оператор, вы только замените символ перед курсором пробелом, но фактически не удалите его.

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

Предлагаемое мной решение должно работать и на некоторых других языках программирования, поскольку оно использует управляющие последовательности ANSI.

person nullmn    schedule 30.12.2018
comment
Добро пожаловать в Stack Overflow! Голосую за вас, так как это хороший альтернативный ответ. Я действительно думаю, что оба ответа эквивалентны, так как удаление символа и перезапись его пробелом, вероятно, одно и то же с точки зрения пользователей. - person Contango; 01.01.2019

Приведенные выше решения отлично работают, если вы не повторяете цикл 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");
person aldosa    schedule 22.04.2014
comment
Это не очень безопасно... Если вы находитесь на новой строке (Console.CursorLeft = 0), это вызовет исключение. - person Andrew Flanagan; 20.05.2014
comment
Я предполагаю, что вам нужно что-то более похожее на Console.SetCursorPosition((Console.CursorLeft - 2 + Console.WindowWidth) % Console.WindowWidth, Console.CursorLeft - 2 ‹= 0 ? Console.CursorTop - 1 : Console.CursorTop); - person Andrew Flanagan; 20.05.2014

Вы можете очистить консоль, а затем записать новый вывод.

person Tony Abrams    schedule 04.03.2011
comment
Я думаю, что это решение плохо масштабируется, если консольное приложение становится более активным; вам придется хранить буфер того, что печатать и перепечатывать много раз. - person Zimano; 07.05.2019

Если вы хотите продолжать писать в той же строке,
перезаписывая содержимое старой строки, а не создавая новую строку,
вы также можете просто написать:

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);
}
person lidqy    schedule 21.06.2020