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

C 語言字串提取整數:修正邏輯漏洞,正確輸出尾部數字

     編輯:程式設計綜合問答

原始代碼邏輯缺陷

代碼掃描字串,遇非數字字元時將累積的數字字元轉為整數存入陣列。致命缺陷:迴圈結束後,若字串以數字結尾(如範例 ...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?89njnk32lnk1237 個數:123 456 7689 89 32 123尾部 123 被補充邏輯捕獲
abc0無數字
1231 個數:123純數字字串
0a02 個數:0 0單獨 0 處理(x!=0 判斷會過濾,若需保留 0 需調整)

進階改良建議

  1. 使用 strtol / sscanf 替代手動轉換,簡潔且處理溢位。
  2. 改用 fgets(s, sizeof(s), stdin) 避免緩衝區溢位。
  3. 動態分配 b 陣列或使用 Vector 結構支援任意數量整數。
  4. 將解析邏輯封裝為函數 int parseIntegers(const char* str, int** outArr) 提高複用性。

總結

**字串以數字結尾時,主迴圈無法觸發「非數字分隔」邏輯**,必須在迴圈外額外檢查 j > 0 並處理剩餘累積數字。此為字串掃描類問題的通用陷阱。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved