這習(xí)題TM一個比一個長.
這個雖然挺長但是還是比較簡單的
捋就從頭捋,在main里按順序看.
剛開始的argc參數(shù)數(shù)量,*argv[]參數(shù)列表(第一個元素是程序名).
然后是數(shù)組tab,這個就相當(dāng)于一個對照表.
settab函數(shù)的作用就是初始化這個對照表.
先看settab的代碼,
先判斷argc是否大于1,如果不是則證明參數(shù)只有程序名一個.不帶參數(shù).所以制表符終止位是默認(rèn)的8.
然后就是將這個對照表初始化.
之后就是帶參數(shù)的情況.
先將對照表初始化成全是NO
然后讀取參數(shù),判斷參數(shù)并將符合條件的(參數(shù)大于0,并且小于最大行數(shù))位置更改.
tabpos函數(shù)的功能就是跟對照表對照.返回值就是當(dāng)前位置與對照表中對比的結(jié)果.
entab函數(shù)就是具體操作了.
首先判斷輸入是否是空白符
如果是則進(jìn)行下列操作..
如果輸入時空格,對比看是否在制表符終止位,
如果不是將記錄空格的nb變量自增.
如果是將記錄空格的變量nb清零,然后將記錄制表符的nt自增.
之后就是遇到非空白符的情況.
先把之前積攢的制表符打印出來.
然后判斷當(dāng)前輸入是否是制表符.
是的話就將記錄空格符的nb清零.
不是制表符的話就將積攢的空格符打印出來.
然后打印當(dāng)前輸入的字符.
遇到換行符,將記錄當(dāng)前位置的pos清零初始化.到每行最開始.
否則遇到制表符,對對照表進(jìn)行對比,將pos加到制表符的位置.
下面是另一個解法
這種方法比前一種簡潔一點(diǎn).
settab還是對對照表進(jìn)行初始化.
detab函數(shù).
這里是多路判定.
首先判斷輸入的字符c是否是制表符.
是制表符的話打印到制表符終止位,
判斷條件是tabpos函數(shù)中的tab數(shù)組是否到了yes.
否則判斷是否是換行符,
是的話輸出這個換行符,
然后將pos初始化成1.
都不是的話就輸出這個字符,然后自增pos.