Как в C# определить длину одной табуляции в пробелах во входном потоке?

Рейтинг: 0Ответов: 1Опубликовано: 16.03.2023

Нужно заменить каждый символ табуляции во входной строке на соответствующее количество пробелов.

Мне удалось сделать то же самое, но с произвольным количеством пробелов вместо табуляции.

public void TabChange(string s, int i) /*s - Строка, на которой будет использоваться метод.
                                        i - Кол-во пробелов, на которое требуется заменить табуляцию.*/
{
    string newString = s.Replace("\t", new string(' ', i));
    Console.WriteLine(newString);
}

Ответы

▲ 0Принят

Табуляция задаёт "сетку" вывода.
Когда встречается символ табуляции, курсор сдвигается до следующей позиции, кратной длине табуляции.
Эта длина никак не задаётся во входном потоке. Её задаёт то приложение, которое выводит текст. То есть в консоли может быть одно значение (обычно 8), в Notepad - другое, в Visual Studio - третье. В своей программе вы сами можете задать это значение.

using System.Text;

string text = "Это\tтекст\tс\tтабуляциями\t!";

Console.WriteLine(text);

ChangeTab(text, 8);

void ChangeTab(string s, int n)
{
    var sb = new StringBuilder();
    int j = 0;

    for (int i = 0; i < text.Length; i++)
    {
        if (s[i] == '\t')
        {
            int tab = n - j % n;
            j += tab;
            
            sb.Append(new string(' ', tab));
        }
        else
        {
            j++;
            sb.Append(s[i]);
        }
    }

    Console.WriteLine(sb.ToString());
}

Здесь счётчик i содержит номер текущего символа во входной строке. Счётчик j содержит текущую позицию в выходной строке.
Когда встречается \t, вместо этого символа добавляем в выходную строку (StringBuilder) такое количество пробелов, чтобы текущая позиция стала кратной n (нашему значению табуляции). И настолько же увеличиваем j.


P.S. В некоторых приложениях для работы с текстом бывает строка табуляции, в которой можно произвольно задавать позиции. После чего при нажатии Tab сдвиг будет происходить до ближайшей позиции на шкале.