標籤:
第一章的一道練習題,開始無論如何都理解不了這道題的意思,直到用VS一步一步的調試著看:
???? 1-21:
編寫程式entab,將空格串替換為最少數量的空格和定位字元,但要保持單詞之間的間隔不變。假設定位字元終止位的位置為8(#define TABINC 8)。當使用一個定位字元或者一個空格都可以到達下一個定位字元終止位的時,選用哪一種替換字元較好?
例如:hello world
hello和world之間有9個空格,這個列印的時候,先列印出hello,然後遇到了第一個空格,此時pos = 6,且pos不在定位字元終止位上,所以nb++;
直到pos = 8 = TABINC時,令nb = 0,nt++,既是將hello後的三個空格換成一個tab。
從pos = 9到pos = 15之間的六個空格,還是六個空格,不做改變。
隨後列印出world,程式結束。
如:he is a boy
he後是一個tab,is後一個tab和兩個空格,a後8個空格一個tab。
當pos =3時,遇到第一個tab,令nb = 0,然後根據公式:pos = pos+(TABINC-(pos-1)%TABINC)-1得出pos=8,既是直接列印一個定位字元,並跳到 TABINC處。
接著列印出is。
pos=11時遇到tab,由公式得出pos=16,跳到第二個TABINC處。
列印完兩個空格後遇到a,pos=19。
a後列印了五個空格後到了第三個TABINC,於是nb = 0,nt++,此時pos=24。
後邊三個空格,列印完後pos=28,遇到\t,於是將之前積累的定位字元和當前遇到的這個定位字元列印出來。
最後列印出boy,程式結束。
1 #include <stdio.h> 2 #define TABINC 8 3 //將空格串替換成最少數量的定位字元和空格,但要保持單詞之間的間隔不變 4 int main(int argc,char* argv[]) 5 { 6 int c,nb,nt,pos; 7 8 nb = 0; 9 nt = 0;10 for(pos = 1;(c = getchar())!=EOF;++pos)11 {12 if(c == ‘ ‘)13 {14 if(pos % TABINC != 0)15 {16 ++nb;17 }else18 {19 nb = 0;20 ++nt; 21 }22 }else {23 for (;nt>0;--nt) {24 putchar(‘\t‘);25 }26 if(c == ‘\t‘)27 nb = 0;28 else29 for(;nb>0;--nb)30 putchar(‘ ‘);31 putchar(c);32 if(c == ‘\n‘)33 pos = 0;34 else if (c == ‘\t‘) {35 pos = pos + (TABINC - (pos - 1) % TABINC) - 1;36 } 37 38 }39 }40 }entab
程式主要是要將全部的空格找出。然後當pos遞增到一個TABINC的倍數的時候,就把空格串替換成一個定位字元。
遇到非空白字元時,程式先將遇到這個字元之前的所有空格和定位字元列印出來後,再列印這個字元。
若當前字元是一個分行符號,則注意重新將pos值設為1.
當遇到一個定位字元時程式只需將此前積累的定位字元和當前遇到的這個定位字元列印出來。
如果只需一個空格就能到達下一個製表位,我們選擇把他替換成一個定位字元,因為這有助於避免特殊情況。
讀書筆記之:C程式設計語言