理解K& R中的细节

时间:2014-10-14 07:16:15

标签: 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')
    {
      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;
}

我很难理解这部分是如何运作的nb = TABINC - (( pos - 1) % TABINC);。有人可以一步一步解释这是做什么的吗?或许请告诉我一个例子?

谢谢。

1 个答案:

答案 0 :(得分:2)

考虑以下输入文本:

\tone\ntwo\tthree\nsixteen\tseventeen\teighteen\n

这是我们希望它生成的(标签替换为···):

         Column: |       |       |       |
         123456789012345678901234567890123
Line: 1  ········one
      2  two·····three
      3  sixteen·seventeen·······eighteen

每个制表符所需的空格数总是从1到TABINC(即8)的数字。上例中的选项卡扩展如下:

Current   Next tab   No. spaces
column#   position   required
   1          9         8
   4          9         5
   8          9         1
  18         25         7

你应该能够在这里看到一个模式。如果我们已经处于制表位置(1,9,17等),我们需要添加8个空格。一般情况下,如果我们n个字符超过标签位置(0 <= n <= 7),那么我们需要添加8-n个空格。

我们可以轻松计算n

n = (pos - 1) % 8

所以nb(我们需要添加的空格数)可以简单计算如下:

nb = 8 - n

因此

nb = 8 - ((pos - 1) % 8)

或者,更一般地说,

nb = TABINC - ((pos - 1) % TABINC)