C程序設計 習題之1-20 detab

碼農必定是最須要動手實操的行業之一。有一句話叫,好記性不如爛筆頭,牽強附會引伸到這裏,變成看書百遍,不如碼字運行一遍。是否是有那麼一點味道?哈哈!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!符合預期。

 

最後的總結就是,習題並不僅是純粹用來爲書加量增厚的,仍是頗有實操的必要!重要的話就說這一遍啦。

相關文章
相關標籤/搜索