Livro de respostas K&R, exercício 1.21
Aqui está a pergunta:
Escreva o entab do programa que substitui cadeias de espaços em branco pelo número mínimo de guias e espaços em branco para obter o mesmo espaçamento. Use as mesmas guias para detab. Quando uma guia ou um único espaço em branco é suficiente para alcançar uma parada de tabulação, qual deve ter preferência?
Eu mesmo fiz o exercício, e a resposta do livro tem uma solução diferente. Não estou entendendo uma fórmula matemática que é executada quando uma guia é lida no fluxo de entrada. Aqui está o código:
#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;
}
}
A parte que não estou entendendo é a seguinte:
else if (c == '\t')
pos = pos + (TABINC - (pos - 1) % TABINC) - 1;
Eu posso ver através da depuração no visual studio que essa construção leva a pos para a próxima parada de guia quando uma guia ocorre no fluxo de entrada. Isso está correto?
O que eu realmente não entendo é como essa fórmula funciona ou como ela surgiu. Essa é uma fórmula comum que ocorre na programação? É útil? Isso tem um nome?
Edit: Eu entendo o que o operador do módulo faz. Me desculpe, eu não especifiquei isso.