第 一 題
依據以下 C 程式碼,回答下列問題:
1 #include <stdio.h>
2 #include <stdlib.h>
3 #include <string.h>
4 #define MAXWL 21
5 #define MAXWS 100
6 int c1(const char* s1, const char* s2) {
7 while (*s1 && *s1 == *s2) {
8 s1++;
9 s2++;
10 }
11 return *s1 - *s2;
12 }
13 int c2(const char* s) {
14 int len = 0;
15 while (s[len]) len++;
16 return len;
17 }
18 int main() {
19 char** words = malloc(MAXWS * sizeof(char*));
20 int count = 0;
21 char buffer[MAXWL];
22 while (1) {
23 if (fgets(buffer, MAXWL, stdin) == NULL) break;
24 buffer[strcspn(buffer, "\n")] = '\0';
25 if (buffer[0] == '\0') break;
26 words[count] = malloc(c2(buffer) + 1);
27 strcpy(words[count], buffer);
28 count++;
29 }
30 for (int i = 0; i < count; i++) {
31 printf("Word: %s, Length: %d\n", words[i], c2(words[i]));
32 }
33 for (int i = 0; i < count - 1; i++) {
34 for (int j = 0; j < count - i - 1; j++) {
35 if (c1(words[j], words[j + 1]) > 0) {
36 char* temp = words[j];
37 words[j] = words[j + 1];
38 words[j + 1] = temp;
39 }
40 }
41 }
42 printf("Sorted words:\n");
43 for (int i = 0; i < count; i++) {
44 printf("%s\n", words[i]);
45 }
46 for (int i = 0; i < count; i++) {
47 free(words[i]);
48 }
49 free(words);
50 return 0;
51 }
小題 (一)
思路引導 VIP
看到此題,首先觀察函式接收兩個字元指標,且迴圈內透過解指標(*s1, *s2)逐一比對字元並遞增指標。最後回傳相異字元的差值,即可輕易辨識出這是 C 標準函式庫 strcmp(字串比較)的底層手動實作,作答時務必點出「字串比較」目的與「回傳值」代表的意義。
小題 (二)
思路引導 VIP
考生看到這段程式碼,應首先分析傳入函式的參數型態與迴圈的終止條件。觀察 while (s[len]) 判斷式可知,當遇到字串結束字元 \0(數值為 0)時迴圈才會停止,透過變數 len 累加計算次數,便能推導出這是在實作計算字串長度的功能。
小題 (三)
思路引導 VIP
遇到程式碼功能解釋題,先將程式碼依據『初始化、輸入處理、核心邏輯更新』等區塊進行拆解。接著逐行觀察變數狀態變化、系統呼叫(如 malloc, fgets)的用途,以及字串處理(如去換行)的細節,最後綜合成一個完整的功能描述。
小題 (四)
思路引導 VIP
看到這題,首先觀察 for 迴圈的邊界條件(走訪 count 次)與迴圈主體(printf 輸出)。接著回溯確認自訂函式 c2 的內部邏輯(透過 while 迴圈計算並回傳字串長度),結合參數 words[i],即可推導出整體程式碼的具體功能。
小題 (五)
思路引導 VIP
觀察巢狀迴圈與相鄰元素(words[j]與words[j+1])比較後交換位置的特徵,可直接判定為氣泡排序法(Bubble Sort)。接著分析比較條件 c1(...) > 0,確認 c1 功能類似 strcmp,即可推導出整體功能為對字串陣列進行字典序遞增排序。
小題 (六)
思路引導 VIP
先觀察第42行的提示字串,再檢視第43至45行的 for 迴圈結構與 printf 函式。由於前段程式碼(第33至41行)剛執行完氣泡排序,因此這段程式碼的目的顯然是將排序後的結果逐一輸出至螢幕。
小題 (七)
思路引導 VIP
看到 free() 函數,第一直覺應聯想到與 malloc() 配對的動態記憶體釋放。接著對照程式碼前半段 words[i] 與 words 的配置位置,說明迴圈內外釋放的具體對象,並點出避免「記憶體洩漏 (memory leak)」的核心目的。
🔗 C 程式執行與資源管理鏈
- 1 空間配置 — malloc 配置字串指標陣列與各別字串空間。
- 2 資料攝入 — fgets 讀取字串並修正終止符,存入動態空間。
- 3 演算法執行 — 透過 c1/c2 自定義函式進行氣泡排序與比較。
- 4 資源釋放 — 依序 free 每一行字串空間,最後釋放主指標。