底下這個程式,我們用 getline() 將文字檔一列一列讀進來,然後將所有的空格和跳格刪除,再輸出到 stdout。
#include <stdio.h> #define BUFSIZE 1025 #define NUL 0 #define HT 9 #define SP 32 int getline(char[], int); /* Read a line from stdin, delete spaces and tabs, output. (dewhite.c) */ main() { char buf[BUFSIZE]; int i, j; while (getline(buf, BUFSIZE) > 0) { for (i=j=0; buf[i] != NUL; ++i) if (buf[i] != SP && buf[i] != HT) buf[j++] = buf[i]; buf[j] = NUL; printf("%s", buf); } }
觀察上述程式。在 for 迴圈的前置作業部分,我們其實做了兩件事: 把 i 和 j 的值都設定成 0。 也可以寫成這樣:
for (i=0, j=0; buf[i] != NUL; ++i)然後,我們在 buf[i] 不是空格也不是跳格的時候, 就將它重新寫入 buf[j],然後將 j 加一。 反之,如果 buf[i] 是空格或是跳格,就不重新儲存它, 因此 j 沒有動,i 卻加一了。 這個效果就是,空格或是跳格都被略去了。 當一列做完的時候,不要忘記在新的 buf[] 尾端寫一個零字元。
習題
void squeeze(char s[], char t[])使得凡是出現在 t 字串中的字元,都從 s 字串中刪除。 舉例來說,如果呼叫
squeeze(buf, " \t");則 buf 字串中的所有空格和跳格都會被刪除。
注意:此處所有文件均為原著,個別的版權宣告日後會一一公布, 整體版面設計亦尚未完成。但仍請勿抄襲文字與圖片,以免觸犯著作權法。
Created: May 8, 2000
Last Revised: May 14, 2000
© Copyright 2000 Wei-Chang Shann 單維彰