我正在教自己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);
。有人可以一步一步解释这是做什么的吗?或许请告诉我一个例子?
谢谢。
答案 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)