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

C 語言輸入數字位數不固定導致輸出亂碼的原因與修正

     編輯:程式設計疑難解答

問題現象

程序要求輸入一個最多 5 位數的整數,輸出位數及各位數字。僅當輸入恰好 5 位數時正常,其他位數輸出亂碼。

核心原因

代碼中使用固定大小數組存儲各位數字,但未初始化數組元素。當輸入位數 < 5 時,高位數組元素保留隨機堆棧值(亂碼),輸出時被一同打印。

錯誤代碼片段

int c = 0, c1[5];  // c1 未初始化!
// ... 計算位數過程中 c 可能 < 5
// 輸出循環固定遍歷 5 次:
for (int i = 0; i < 5; i++) {
    printf("%d", c1[i]);  // 高位輸出未初始化的垃圾值
}

修正方案

方法一:初始化數組(最簡單)

int c1[5] = {0};  // 全部初始化為 0

方法二:動態確定有效位數(推薦)

#include <stdio.h>

int main() {
    long long num;  // 支持更大範圍
    int digits[20] = {0};  // 足夠大並初始化
    int count = 0;
    
    printf("請輸入一個整數(最多 5 位):");
    scanf("%lld", &num);
    
    if (num == 0) {
        printf("位數:1\n各位數字:0\n");
        return 0;
    }
    
    // 處理負數
    if (num < 0) {
        printf("負號:-\n");
        num = -num;
    }
    
    // 分解各位(逆序存儲)
    while (num > 0) {
        digits[count++] = num % 10;
        num /= 10;
    }
    
    // 輸出結果
    printf("位數:%d\n各位數字:", count);
    for (int i = count - 1; i >= 0; i--) {  // 逆序輸出正確順序
        printf("%d ", digits[i]);
    }
    printf("\n");
    
    return 0;
}

關鍵點總結

  • 數組必須初始化:C 語言局部數組不自動初始化,殘留值不可預測。
  • 動態記錄有效長度:使用計數器 count 記錄實際位數,輸出時只遍歷有效範圍。
  • 逆序存儲、正序輸出:取模運算從低位到高位,存儲時逆序,輸出時再逆序還原。
  • 邊界處理:單獨處理 0 和負數情況。
  • 類型選擇:用 long long 避免溢出,數組大小預留充足(如 20)。

擴展:遞歸實現(無需數組)

void printDigits(long long n) {
    if (n < 0) { putchar('-'); n = -n; }
    if (n >= 10) printDigits(n / 10);
    putchar('0' + n % 10);
    putchar(' ');
}

總結

亂碼根源是未初始化數組元素被誤輸出。解決核心在於初始化數組與動態控制輸出範圍,推薦使用計數器記錄實際位數的通用解法。

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