碼農必定是最須要動手實操的行業之一。有一句話叫,好記性不如爛筆頭,牽強附會引伸到這裏,變成看書百遍,不如碼字運行一遍。是否是有那麼一點味道?哈哈!spa
這幾天看的《C程序設計》,看完每一個章節仍是以爲沒有徹底落實,因而老老實實動手把習題作一遍,算是對不踏實心裏的一個交待。仔細作下來才發現,習題其實並非做者行文的簡單回顧總結,而是在此基礎上另有拔高和引伸,若是你錯過了,就少學不少東西。廢話很少說,下面說一說1-20 detab這個小練習;設計
題目是這樣的:code
編寫程序detab, 將輸入中的製表符替換成適當數目的空格,使空格充滿到
下一個製表符終止位的地方。假設製表符終止位的位置是固定的,好比每隔B列就會出現一個
製表符終止位。"應該做爲變貴述是符號常量呢?blog
看了兩遍,按理解寫出了下面的代碼:get
1 #include <stdio.h> 2 3 #define TABNUM 4 4 5 int main() 6 { 7 char text[1000]; 8 char c; 9 int index = 0; 10 11 while ((c = getchar()) != EOF) 12 { 13 if (c == '\t') 14 { 15 for (int i = 0; i < TABNUM; ++i) 16 { 17 text[index] = ' '; 18 ++index; 19 } 20 } 21 else 22 { 23 text[index] = c; 24 ++index; 25 } 26 27 } 28 29 printf("%s\n", text); 30 31 return 0; 32 }
cc 編譯正常,在運行驗證時,發現直接用4個空格替換與輸入並不吻合,輸入時tab能根據實際輸入對齊io
感受中間補足的空格數應該有必定規律。因而,上網搜索果真發現tab處理有玄機。好比tab長度是8,從最開始算起,輸入不足8個字符,此時按tab,系統會自動把光標跳到第9個字符,接下來的字符今後開始,若是此時再輸入9個字符,則系統會將光標定位到第25個字符處,其中的規律能夠總結成:編譯
pos = pos + 8 - (pos - 1) % 8程序設計
也就是說當光標在pos位置時,輸入tab,光標會跳轉至pos + 8 - (pos - 1) % 8的位置。class
因而,改進後的代碼以下:基礎
1 #include <stdio.h> 2 3 #define TABNUM 8 4 5 int main() 6 { 7 char text[1000]; 8 char c; 9 int index = 0; 10 int pos = 1; 11 int space_number; 12 13 while ((c = getchar()) != EOF) 14 { 15 if (c == '\t') 16 { 17 space_number = TABNUM - (pos - 1) % TABNUM; 18 while (space_number > 0) 19 { 20 text[index] = ' '; 21 ++index; 22 ++pos; 23 --space_number; 24 } 25 } 26 else if (c == '\n') 27 { 28 text[index] = c; 29 pos = 1; 30 ++index; 31 } 32 else 33 { 34 text[index] = c; 35 ++index; 36 ++pos; 37 } 38 39 } 40 41 printf("%s\n", text); 42 43 return 0; 44 }
運行驗證:
Perfect!符合預期。
最後的總結就是,習題並不僅是純粹用來爲書加量增厚的,仍是頗有實操的必要!重要的話就說這一遍啦。