我們知道,流程控制結構可分三類:迭代、邏輯分岔、遞迴。 現在我們已經知道 C 語言的所有迭代結構:while、do-while 和 for。 以前,在邏輯分岔這一類,我們只知道 if-else 結構。 現在介紹第二種:switch。其實,也就只有這兩類。
switch 的基本結構如下。
switch (EXPR) { case CONST_A: BODY_A case CONST_B: BODY_B default: BODY }其中 EXPR 是一個 C 的語句,任何語句都可以, 只要它產生的值是整數類的資料型態。 而 CONST_A、CONST_B 必需是不同的常數整數、 或常數整數所組成的語句,例如 3 或 '\n' 或 3+5 之類的。 如果有必要,可以增加更多的 case。 case 語句以冒號 : 結尾。
當 EXPR 產生的值 == CONST_A 的時候,就會執行 BODY_A 裡面的指令。按照正常的流程來執行。 但是,要非常非常注意,switch 在此時並不像是 if-else 結構。 當 BODY_A 裡面根本沒有指令的時候,不必寫一個單獨的分號 ;。 而當 BODY_A 裡面的指令都做完了之後,流程不會跳到 switch 結束的地方, 而是繼續執行 BODY_B 裡面的指令、 甚至於繼續執行 BODY 裡面的指令。 一直到 switch 結構的結束為止 (到了 } 處)。 如果要 C 只執行 BODY_A 或 BODY_B, 必須自己寫上一個 break; 指令。 它代表結束最內層的 for、while、do-while 或 switch 結構。
舉例來說,以下是一個 switch 結構的正確用法:(雖然有些無聊)
switch (c = getchar()) { case ' ': case '\t': printf("c is a white\n"); break; case '0': case '1': case '2': case '3': case '4': case '5': case '6': case '7': case '8': case '9': printf("c is a digit\n"); break; default: printf("c is something else\n"); break; }理論上,default: 是寫在最後面的,所以,它的 BODY 部分, 應該可以不寫 break;。 這個推理是對的。但是,最好養成習慣,還是寫上。 以免以後修改程式的時候,將 default: 改成另一個 case, 另外加一個 default:,然後就忘了要添 break; 在新的 case 裡面。
現在,我們要寫一個比較有用的範例程式 par2str.c。 這個程式,將輸入文字檔的段落當中的 LF 都換成 \n, " 都換成 \", \ 都換成 \\,並且在所有輸出字元的最前面和最後面, 添加 "。 所謂段落,就是以一個以上的空列所隔開的字串。 但是僅含有空白的列,並不算是空列。 換句話說,par2str.c 將每個段落變成一個字串。
#include <stdio.h> #define BUFSIZE 81 #define WHITE(c) (c == ' ' || c == '\t') #define IN 1 #define OUT 0 #define LF '\n' #define QUOT '\"' #define NUL 0 int getline(char[], int); /* 將文字檔案的每一個段落,變成一個字串 (par2str.c) */ main() { int i, par=OUT, line=OUT; char buf[BUFSIZE]; while (getline(buf, BUFSIZE) > 0) { if (buf[0] == LF && par == IN && line == OUT) { /* par ends */ putchar(QUOT); putchar(LF); par = OUT; } if (buf[0] != LF && par == OUT) { /* par begins */ putchar(QUOT); par = IN; } if (par == IN) { for (i=0; buf[i] != NUL; ++i) switch (buf[i]) { case LF: printf("\\n"); break; case QUOT: printf("\\\""); break; case '\\': printf("\\\\"); break; default: putchar(buf[i]); break; } if (buf[i-1] == LF) line = OUT; else line = IN; } } if (par == IN) printf("\"\n"); }
例如,檔案 aa 的內容是
a b c d e則被 par2str 過濾之後,就會變成
"a b\n c\n \nd\n" "e\n"我們看到,c 和 d 之間並非空列,而是含有 3 個空格。
習題
注意:此處所有文件均為原著,個別的版權宣告日後會一一公布, 整體版面設計亦尚未完成。但仍請勿抄襲文字與圖片,以免觸犯著作權法。
Created: May 20, 2000
Last Revised: May 21, 2000
© Copyright 2000 Wei-Chang Shann 單維彰