代碼掃描字串,遇非數字字元時將累積的數字字元轉為整數存入陣列。致命缺陷:迴圈結束後,若字串以數字結尾(如範例 ...123),最後一組數字**永不進入 else 區塊**,導致遺漏輸出。
#include <stdio.h>
#include <math.h>
void main() {
int i, j = 0, k = 0, x = 0, n, m, b[100];
char s[100], a[100];
gets(s); // 注意:gets 不安全,教學用;實務請用 fgets
for (i = 0; s[i] != '\\0'; i++) {
if (s[i] >= '0' && s[i] <= '9') {
a[j++] = s[i];
} else {
if (j > 0) { // 有累積數字才處理
j--;
for (n = 0; j >= 0; j--, n++)
x += (a[j] - '0') * (int)pow(10, n);
if (x != 0) b[k++] = x;
x = 0; j = 0;
}
}
}
/* === 關鍵補充:處理字串結尾的數字 === */
if (j > 0) {
j--;
for (n = 0; j >= 0; j--, n++)
x += (a[j] - '0') * (int)pow(10, n);
if (x != 0) b[k++] = x;
}
printf(\"%d\\n\", k);
for (m = 0; m < k; m++) printf(\"%d \", b[m]);
printf(\"\\n\");
}
| 輸入字串 | 預期輸出 | 說明 |
|---|---|---|
a123x456 7689?89njnk32lnk123 | 7 個數:123 456 7689 89 32 123 | 尾部 123 被補充邏輯捕獲 |
abc | 0 | 無數字 |
123 | 1 個數:123 | 純數字字串 |
0a0 | 2 個數:0 0 | 單獨 0 處理(x!=0 判斷會過濾,若需保留 0 需調整) |
strtol / sscanf 替代手動轉換,簡潔且處理溢位。fgets(s, sizeof(s), stdin) 避免緩衝區溢位。b 陣列或使用 Vector 結構支援任意數量整數。int parseIntegers(const char* str, int** outArr) 提高複用性。**字串以數字結尾時,主迴圈無法觸發「非數字分隔」邏輯**,必須在迴圈外額外檢查 j > 0 並處理剩餘累積數字。此為字串掃描類問題的通用陷阱。