练习1-21entab

主要思路习题解答的书上已经说了,
if(c == ‘ ’)先找空格
if(pos % TABINC != 0)
++nb;
else {
nb = 0;
++nt;
}
这段主要是找到空格然后判断是否到了制表符终止位,如果到了制表符终止位为止之前都是空格那么就将换成制表符,这里如果这里pos % TABINC != 0 不成立的话就证明现在的这个空格正好在制表符终止位上,也就是说差一个空格就到制表符终止位,那么也将输出制表符。
如果遇到非空格符,因为之前存储的空位(就是空格和相应的制表符)还没有打印出来,所以要先将之前记录的那些空位补上。
先判断需不需要打印制表符(有无nt)。然后判断是否是制表符,如果是,将储存空格数量的nb清空,因为如果是制表符那么肯定就会直接到制表符终止位,所以空格就不需要了,就像能直接到终点的话过程就不重要了。然后如果不是制表符的话就老实的有几个存储的空格就输出几个。
然后输出这个非空格字符。
接着将pos这个记录位置的变量重置,
如果输出的是换行符那么pos理所当然的就重置为0了,因为是某一行的刚开始。
pos = pos + (TABINC - (pos - 1) % TABINC) - 1;
这个公式括号里的部分跟1-20的练习是一样的都是得出还差几个位置到达制表符中止位,因为pos已经把‘\t’加进去了所以要-1,才是当前(忽略制表符)的位置,最后的那个-1也是同理,最后将目前的位置加上距离制表符终止位还差多少得出最新的位置。

你可能感兴趣的:(练习1-21entab)