底下這個程式,我們用 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 單維彰