break

相對於 continue; 有一個 break; 指令。 在 for, whiledo-while 迴圈中, 如果出現了 break; 指令,表示結束這個迴圈,執行迴圈後的下一個指令。 。明確地說,如果是

while (COND) {
    ...
    break;
    ...
}
或是
do {
    ...
    break;
    ...
} while (COND);
或是
for (PRE ; COND ; POST) {
    ...
    break;
    ...
}
則在遇到 break; 之後,跳去執行 } 的下一個指令。 而且,break; 只對最內層的 for, whiledo-while 迴圈生效,如果有層層相套的迴圈,要注意這個現象。 類似於 continue;, 通常 break; 都是寫在迴圈內的 if-else 結構內。

以下,我們以一個 trim 程式示範 break; 的用法。 這個程式,從 stdin 讀入文字資料, 假設每一列都不會超過 1024 個字元 (包括 LF)。 在輸出的時候,不輸出最後面的連續空白 (空格或跳格)。 換句話說,我們刪除了每一列的尾端連續空白。


#include <stdio.h>
#define BUFSIZE 1025

int getline(char[], int);

/* Delete the tail whites  (trim.c) */
main () {
    int n, c;
    char buf[BUFSIZE];

    while ((n=getline(buf, BUFSIZE)) > 0) {
	for (--n; n >= 0; --n)
	    if ((c=buf[n]) != ' ' && c != '\t' && c != '\n')
		break;
	buf[n+1] = '\0';
	printf("%s\n", buf);
    }
}

請讀者自己將 getline() 鏈結到 trim.c 裡面。 當 getline(buf, BUFSIZE) 的返回值是 n 時, buf[n]'\0',而 buf[n-1]'\n'。 這就是為什麼 for 一開始的時候,要先 --n。 在這個 for 迴圈裡面,我們刪除了 '\n'。 但是,不要緊,在 printf("%s\n", buf); 裡面又把它添回去了。 在 if 結構裡面,我們也可以寫
        if (buf[n] != ' ' && buf[n] != '\t' && buf[n] != '\n')
但是,我覺得這樣看起來很醜,所以用一個簡單的變數名 c 來代替 buf[n]。這樣做是個人喜好,不必要的。

以上那個程式,很容易就誤寫為

    while (buf[n] == ' ' || buf[n] == '\t' || buf[n] == '\n')
        --n;
這樣做,錯在哪裡呢?在於極端狀況: 如果 buf[] 裡面是一個空列呢?while 的條件恆真, 一直到 buf[0] 還是 True,這時候它不知道要停下來, 繼續去檢查 buf[-1]buf[-2] ... 結果就錯了。

習題

[ 前一節 ]‧[ 後一節 ]‧[ 回目錄 ]



注意:此處所有文件均為原著,個別的版權宣告日後會一一公布, 整體版面設計亦尚未完成。但仍請勿抄襲文字與圖片,以免觸犯著作權法。

Created: May 20, 2000
Last Revised: May 20, 2000
© Copyright 2000 Wei-Chang Shann 單維彰

shann@math.ncu.edu.tw