首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計綜合問答

C 語言字串提取整數:為何輸出大量 0?變數初始化與索引邏輯錯誤分析

     編輯:程式設計綜合問答

錯誤代碼關鍵片段

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;
    }
}

逐步推演錯誤原因

  1. 輸入 a123x...,i=0 時 s[0]='a' 非數字 → 進入 else。
  2. 此時 j=0,執行 j-- → j=-1。
  3. for (n=0; j>=0; ...) 條件 -1 >= 0 為假,**迴圈零次執行**,x 維持 0。
  4. 無條件 b[k++] = x → b[0] = 0。**每遇一個非數字字元就產生一個 0**。
  5. 後續真正數字段落處理時,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;
}

完整修正版參考上一題(ID 29656)

核心差異:

  • 進入 else 前檢查 j > 0,避免非數字開頭產生垃圾 0。
  • 迴圈後補充尾部數字處理。
  • 使用 strtol 替代手動累加,消除索引與次方運算錯誤。

教訓總結

  1. **陣列索引操作必須確保邊界合法**(j-- 前確認 j>0)。
  2. **狀態機思維**:掃描字串時維持「在數字段內/外」狀態,狀態切換時才提交結果。
  3. **善用標準庫**(strtol, strtoull, sscanf)降低手寫解析錯誤率。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved