字串與函式的應用範例

底下這個程式,我們用 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);
    }
}

請自行剪貼 getline() 到上面的原始檔案中。

觀察上述程式。在 for 迴圈的前置作業部分,我們其實做了兩件事: 把 ij 的值都設定成 0。 也可以寫成這樣:

        for (i=0, j=0; buf[i] != NUL; ++i)
然後,我們在 buf[i] 不是空格也不是跳格的時候, 就將它重新寫入 buf[j],然後將 j 加一。 反之,如果 buf[i] 是空格或是跳格,就不重新儲存它, 因此 j 沒有動,i 卻加一了。 這個效果就是,空格或是跳格都被略去了。 當一列做完的時候,不要忘記在新的 buf[] 尾端寫一個零字元。

習題

  1. 寫一個符合以下規格的函式
    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 單維彰

shann@math.ncu.edu.tw