Libro de respuestas K&R ejercicio 1.21
Aquí está la pregunta:
Escriba el entab de programa que reemplaza las cadenas de espacios en blanco por el número mínimo de pestañas y espacios en blanco para lograr el mismo espacio. Use la misma pestaña que para detab. Cuando una pestaña o un solo espacio en blanco sería suficiente para alcanzar una tabulación, ¿a qué debería darse preferencia?
Hice el ejercicio yo mismo, y la respuesta del libro tiene una solución diferente. No estoy entendiendo una fórmula matemática que se ejecuta cuando se lee una pestaña de la secuencia de entrada. Aquí está el 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;
}
}
La parte que no entiendo es la siguiente:
else if (c == '\t')
pos = pos + (TABINC - (pos - 1) % TABINC) - 1;
Puedo ver a través de la depuración en Visual Studio que esta construcción lleva la posición a la siguiente tabulación cuando se produce una pestaña desde el flujo de entrada. ¿Es esto correcto?
Lo que realmente no entiendo es cómo funciona esta fórmula o cómo se le ocurrió. ¿Es esta una fórmula común que ocurre en la programación? ¿Es útil? Eso tiene un nombre?
Edición: Entiendo lo que hace el operador de módulo. Lo siento, no especifiqué eso.