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

C 語言 scanf 格式字串陷阱:中文字符導致輸入失敗、遞迴誤區

     編輯:程式設計綜合問答

程式碼意圖用遞迴計算總和,但無論輸入什麼,輸出固定數值。經排查,非遞迴邏輯錯誤,而是 scanf 格式字串包含中文字符導致輸入匹配失敗,變數未被賦值,殘留棧上隨機值參與運算。

錯誤程式碼

int n;
scanf("請輸入一個數字:%d", &n); // 格式字串含中文
printf("總和 = %d", sum(n));

為什麼會失敗?

  • scanf 按格式字串逐字符匹配輸入流。
  • 用戶輸入 10\n,格式字串期望 請輸入一個數字: 開頭 → 匹配失敗,scanf 立即返回,n 未修改。
  • n 為未初始化區域變數 → 不定值 → 運算結果不可預期。

正確寫法

printf("請輸入一個數字:"); // 提示訊息單獨印
scanf("%d", &n);            // 格式字串只含格式指示符

補充:這不是遞迴

原程式碼 sum(n) 內部未呼叫自己,只是普通函式。**遞迴定義:函式直接/間接呼叫自身**,如:

int sum(int n) {
    if (n <= 1) return n;
    return n + sum(n - 1); // 真正的遞迴
}

scanf 格式字串最佳實務

錯誤正確說明
scanf("數字:%d", &n);printf("數字:"); scanf("%d", &n);提示與讀取分離
scanf("%d%d", &a, &b);scanf("%d %d", &a, &b);空白分隔更穩健
忽略返回值if (scanf("%d", &n) != 1) { /* 錯誤處理 */ }檢查匹配成功數量
緩衝區殘留換行符scanf(" %c", &ch); (前置空白)跳過空白字符

總結

scanf 格式字串只能包含格式指示符(%d、%f、%c...)與空白字符,任何可見字符(含中文、標點)都會要求輸入流完全匹配,導致讀取失敗。養成「提示用 printf、讀取用純格式 scanf」的習慣,並永遠檢查返回值。

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