for (i = 0; s[i] != '\\0'; i++) {
if (s[i] >= '0' && s[i] <= '9')
a[j++] = s[i];
else {
j--; // ❌ 錯誤:j 可能為 0,遞減成 -1
for (n = 0; j >= 0; j--, n++)
x += (a[j] - '0') * (int)pow(10, n);
b[k++] = x; // ❌ 無條件存入,即使 x=0
x = 0; j = 0;
}
}
a123x...,i=0 時 s[0]='a' 非數字 → 進入 else。j=0,執行 j-- → j=-1。for (n=0; j>=0; ...) 條件 -1 >= 0 為假,**迴圈零次執行**,x 維持 0。b[k++] = x → b[0] = 0。**每遇一個非數字字元就產生一個 0**。j 重置邏輯也有缺陷,導致索引錯亂。if (j > 0) { // 只有累積了數字才處理
j--; // 退回到最後一個數字字元索引
for (n = 0; j >= 0; j--, n++)
x += (a[j] - '0') * (int)pow(10, n);
if (x != 0 || 允許單獨0) b[k++] = x; // 條件存入
x = 0; j = 0;
}
核心差異:
j > 0,避免非數字開頭產生垃圾 0。strtol 替代手動累加,消除索引與次方運算錯誤。j-- 前確認 j>0)。strtol, strtoull, sscanf)降低手寫解析錯誤率。