司法三等申論題
114年
[檢察事務官電子資訊組] 程式語言
第 一 題
針對以下 C 程式碼,請先說明執行該程式之輸出,以及程式中函式 left()、right() 之運作功能;並請說明在 testGen() 測試 left()、right() 過程中,有那幾行指令未被充分測試。(25 分)
01 #include
02 #include
03 #include
04 char* left(char* data, int len, const char symbol) {
05 int dLen = strlen(data);
06 char* result = (char*)malloc(dLen + 1);
07 if (len > dLen) len = dLen;
08 strcpy(result, data);
09 for (int i = len; i < dLen; i++) result[i] = symbol;
10 return result;
11 }
12 char* right(char* data, int len, const char symbol) {
13 int dLen = strlen(data);
14 char* result = (char*)malloc(dLen + 1);
15 if (len > dLen) len = dLen;
16 strcpy(result, data);
17 for (int i = (dLen-len); i < dLen; i++) result[i] = symbol;
18 return result;
19 }
20 void testGen() {
21 char str[] = "abcdef";
22 char* left1 = left(str, 4, '@');
23 char* left2 = left(str, 8, '@');
24 char* right1 = right(str, 4, '@');
25 printf("%s\n", left1);
26 printf("%s\n", left2);
27 printf("%s\n", right1);
28 free(left1);
29 free(left2);
30 free(right1);
31 }
32 int main() {
33 testGen();
34 return 0;
35 }
01 #include
02 #include
03 #include
04 char* left(char* data, int len, const char symbol) {
05 int dLen = strlen(data);
06 char* result = (char*)malloc(dLen + 1);
07 if (len > dLen) len = dLen;
08 strcpy(result, data);
09 for (int i = len; i < dLen; i++) result[i] = symbol;
10 return result;
11 }
12 char* right(char* data, int len, const char symbol) {
13 int dLen = strlen(data);
14 char* result = (char*)malloc(dLen + 1);
15 if (len > dLen) len = dLen;
16 strcpy(result, data);
17 for (int i = (dLen-len); i < dLen; i++) result[i] = symbol;
18 return result;
19 }
20 void testGen() {
21 char str[] = "abcdef";
22 char* left1 = left(str, 4, '@');
23 char* left2 = left(str, 8, '@');
24 char* right1 = right(str, 4, '@');
25 printf("%s\n", left1);
26 printf("%s\n", left2);
27 printf("%s\n", right1);
28 free(left1);
29 free(left2);
30 free(right1);
31 }
32 int main() {
33 testGen();
34 return 0;
35 }
📝 此題為申論題
思路引導 VIP
- 首先追蹤
left與right的迴圈邏輯,注意字串索引與symbol替換的範圍,並逐步寫出testGen內三個函式呼叫的字串輸出。 - 接著對比測試參數 (4, 8, 4) 與函式內的條件式 (
len > dLen),檢視是否有特定分支(True/False)從未被觸發,藉此找出缺乏分支涵蓋率(Branch Coverage)的程式碼行號。
🤖
AI 詳解
AI 專屬家教
【破題】 本題考查 C 語言字串操作、指標與動態記憶體配置的執行追蹤,同時藉由檢視測試案例評估程式碼的分支涵蓋率(Branch Coverage),以找出缺乏測試的特定指令。 【論述】
▼ 還有更多解析內容
C 字串操作與分支涵蓋率
💡 透過執行追蹤驗證字串邏輯,並以分支涵蓋率評估測試案例的完整性。
| 比較維度 | left() 函式測試 | VS | right() 函式測試 |
|---|---|---|---|
| 測試案例數量 | 2 個 (len=4, len=8) | — | 1 個 (len=4) |
| 條件 True 分支 | 已執行 (len=8 > dLen) | — | 未執行 (需 len > 6) |
| 條件 False 分支 | 已執行 (len=4 < dLen) | — | 已執行 (len=4 < dLen) |
| 涵蓋率評價 | 充分涵蓋 | — | 不充分 (缺失第 15 行) |
💬left() 完整測試了邊界防護,right() 則漏掉 len 大於字串長度的極端情況。