C 理解K&;中的detab;R

C 理解K&;中的detab;R,c,tabs,modulo,kernighan-and-ritchie,entab-detab,C,Tabs,Modulo,Kernighan And Ritchie,Entab Detab,我在自学C和K&R。我在做练习1-20: 编写一个程序entab,用最少的制表符和空格数替换空格串,以获得相同的间距。使用与detab相同的制表位 我自己完成了这个项目,但正在回顾其他解决方案: #include<stdio.h> #define TABINC 8 int main(void) { int nb,pos,c; nb = 0; pos = 1; while((c=getchar())!=EOF) { if( c == '\t')

我在自学C和K&R。我在做练习1-20:

编写一个程序entab,用最少的制表符和空格数替换空格串,以获得相同的间距。使用与detab相同的制表位

我自己完成了这个项目,但正在回顾其他解决方案:

#include<stdio.h>
#define TABINC 8

int main(void)
{
  int nb,pos,c;

  nb = 0;
  pos = 1;

  while((c=getchar())!=EOF)
  {
    if( c == '\t')
    {
      nb = TABINC - (( pos - 1) % TABINC);   // <---- How does this work

      while( nb > 0)
      {
        putchar('#');
        ++pos;
        --nb;
      }
    }
    else if( c == '\n')
    {
      putchar(c);
      pos = 1;
    }
    else
    {
      putchar(c);
      ++pos;
    }
  }

  return 0;
}
#包括
#定义TAB8
内部主(空)
{
国际nb,pos,c;
nb=0;
pos=1;
而((c=getchar())!=EOF)
{
如果(c=='\t')
{
nb=TABINC-((位置-1)%TABINC);//0)
{
putchar(“#”);
++pos;
--铌;
}
}
else如果(c=='\n')
{
普查尔(c);
pos=1;
}
其他的
{
普查尔(c);
++pos;
}
}
返回0;
}
我很难理解这部分是如何工作的
nb=TABINC-((pos-1)%TABINC)。有人能一步一步地解释一下这到底在做什么吗?也许可以给我举个例子


谢谢。

考虑以下输入文本:

\tone\ntwo\tthree\nsixteen\tseventeen\teighteen\n
这就是我们希望它产生的结果(选项卡被替换为
·····
):

每个制表符字符所需的空格数始终为1到
TABINC
(即8)之间的数字。上例中的选项卡展开如下:

nb = 8 - n
当前下一个选项卡编号空格
列#所需位置
1          9         8
4          9         5
8          9         1
18         25         7
你应该可以在这里看到一个模式。如果已经处于制表符位置(1、9、17等),则需要添加8个空格。一般来说,如果我们是
n
个字符,超过一个制表符位置(其中
0
n = (pos - 1) % 8
nb = 8 - n
nb = 8 - ((pos - 1) % 8)
nb = TABINC - ((pos - 1) % TABINC)