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

C語言 scanf/printf 格式符不匹配導致輸出為 0 的經典案例

     編輯:C 語言問答

問題代碼

#include <stdio.h>
#include <math.h>

main() {
    double a, b, i, j, s = 0;
    printf("請輸入a和次數\n");
    scanf("%d %d", &a, &j);  // ❌ 錯誤:%d 對應 int*,實傳 double*
    for (i = 0; i <= j; i++) {
        b = pow(10, i);
        s = s + a * b;
    }
    printf("s=%d\n", s);      // ❌ 錯誤:%d 對應 int,實傳 double
}

現象:無論輸入什麼,s 輸出總是 0。

根因分析:格式符與實際類型嚴重不匹配

正確代碼

#include <stdio.h>
#include <math.h>

int main() {          // 標準返回 int
    double a, b, i, j, s = 0;
    printf("請輸入a和次數\n");
    scanf("%lf %lf", &a, &j);  // ✅ double 輸入用 %lf
    for (i = 0; i <= j; i++) {
        b = pow(10, i);
        s = s + a * b;
    }
    printf("s=%lf\n", s);      // ✅ double 輸出用 %lf (或 %f)
    return 0;
}

格式符完整對照表(掛牆必備)

調用格式符期望類型實際參數類型後果
scanf("%d %d", &a, &j)%dint *double * (8字節)只讀取 4 字節,高 4 字節未寫入/破壞棧,a/j 值亂
printf("s=%d\n", s)%dintdouble (8字節)只取低 4 字節解釋為 int,通常為 0(IEEE 754 雙精度小數低位常為 0)
類型scanf 輸入printf 輸出備註
int%d / %i%d
unsigned int%u%u
long%ld%ld
long long%lld%lldC99
float%f / %e / %g%f / %e / %gprintf %f 默認 6 位小數
double%lf / %le / %lg%f / %lf / %e / %gscanf 必須 %lf;printf %f 也可(默認提升)
long double%Lf%Lf
char (字符)%c%cscanf 需跳過空白可用 %c
char * (字符串)%s%sscanf 不需 &,需防溢出用 %Ns
void * (指針)%p%p標準輸出格式

為什麼 double 輸入用 %lf、輸出用 %f 也行?

  • scanf:需精確知道內存大小寫入,**必須區分** float*(4B) 和 double*(8B),故 %f 對應 float*,%lf 對應 double*。
  • printf:參數經歷默認參數提升,float 自動提升為 double,故 %f、%lf、%e、%le 等**完全等價**處理 double 值。C99 規定 %lf 在 printf 合法且同 %f。

避坑金律

  1. 編譯器警告拉滿:-Wall -Wextra -Wformat=2 (GCC/Clang)、**絕對能報出** 此類不匹配。
  2. 查閱手冊:不確定時 `man scanf` / `man printf` 或 cppreference.com。
  3. 統一用 %lf 讀寫 double**:雖 printf 可用 %f,但統一 %lf 更清晰、不易混淆。
  4. 調試時打印地址與值:printf("a=%lf, &a=%p\n", a, &a); 確認讀寫正確。

總結

本案例中 scanf("%d", &double_var) 只寫入 4 字節導致高位殘留垃圾值,printf("%d", double_var) 只讀低 4 字節解釋為 int 多為 0。**格式符與類型嚴格匹配是 C 語言 I/O 正確性的基石**,務必牢記 double → %lf、float → %f、int → %d、long long → %lld、指針 → %p,並開啟編譯器格式檢查警告。

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