K & R тетрадь упражнение 1.21
Вот вопрос:
Напишите программу entab, которая заменяет строки пробелов минимальным количеством вкладок и пробелов для достижения одинакового расстояния. Используйте те же табуляции, что и для detab. Когда для достижения позиции табуляции будет достаточно вкладки или одного пробела, какой из них следует отдать предпочтение?
Я выполнил упражнение сам, и ответ книги имеет другое решение. Я не понимаю математическую формулу, которая выполняется, когда вкладка читается из входного потока. Вот код:
#include <stdio.h>
#define TABINC 8
main()
{
int c, nb, nt, pos;
nb = 0;
nt = 0;
for (pos = 1; (c =getchar()) != EOF; ++pos)
if (c == ' '){
if (pos % TABINC != 0)
++nb;
else {
nb = 0;
++nt;
}
}
else {
for ( ; nt > 0; --nt)
putchar('\t');
if (c == '\t')
nb = 0;
else
for ( ; nb > 0; --nb)
putchar(' ');
putchar(c);
if ( c == '\n')
pos = 0;
else if (c == '\t')
pos = pos + (TABINC - (pos - 1) % TABINC) - 1;
}
}
Часть, которую я не понимаю, следующая:
else if (c == '\t')
pos = pos + (TABINC - (pos - 1) % TABINC) - 1;
Через отладку в Visual Studio я вижу, что эта конструкция переносит позицию к следующей остановке вкладки, когда вкладка происходит из входного потока. Это верно?
Что я действительно не понимаю, так это то, как работает эта формула или как они ее придумали. это общая формула, которая встречается в программировании? Это полезно? У него есть имя?
Изменить: я понимаю, что делает оператор по модулю. Извините, я не уточнил это.