C 語言「%lf」用法完整指南:printf 與 scanf 的差異與注意事項

1. 前言

在 C 語言中,數值與字串的顯示與輸入會使用格式指定符(Format Specifier)。特別是在處理浮點數時,理解「%f」與「%lf」等指定符的差異,對於正確撰寫程式非常重要。本文將聚焦於對應倍精度浮點數(double 型)的「%lf」用法,並說明其在 printfscanf 函式中的使用方式,以及與其他指定符的差異。

2. 什麼是格式指定符

格式指定符是在 C 語言中,用於指定資料顯示或輸入格式的符號。使用與資料型態對應的指定符,可以正確地進行資料的輸入與輸出。我們先來看看常見的格式指定符與其對應的資料型態。

常見格式指定符與資料型態對應表

格式指定符對應的資料型態
%dint 型(整數)
%ffloat 型(單精度浮點數)
%lfdouble 型(倍精度浮點數)
%Lflong double 型(擴展倍精度浮點數)

3. 在 printf 函式中使用「%lf」

C 語言的 printf 函式用於依指定格式顯示資料。在顯示倍精度浮點數時,「%f」與「%lf」皆可使用,但它們的用法有些許差異。

printf 中「%lf」與「%f」的差異

printf 中,%f%lf 都可以用來輸出 double 型資料。這是因為 printf 在輸出浮點數時,會自動將引數提升為 double 型。因此,在輸出倍精度浮點數時,通常習慣使用「%f」。

使用範例

#include <stdio.h>

int main() {
    double num = 3.14159;
    printf("%f\n", num);  // 輸出: 3.141590
    printf("%lf\n", num); // 輸出: 3.141590
    return 0;
}

從以上範例可見,兩種指定符輸出的結果相同,但在 printf 輸出 double 時,一般慣用 %f

4. 在 scanf 函式中使用「%lf」

scanf 用於將輸入的資料存入指定型態的變數。在 scanf 中,必須讓指定符與變數的資料型態完全一致,這時「%f」與「%lf」的區分就很重要。

scanf 中「%lf」與「%f」的差異

  • 「%f」:用於將輸入存入 float 型變數。
  • 「%lf」:用於將輸入存入 double 型變數。若輸入目標為 double 型,必須使用 %lf

使用範例

#include <stdio.h>

int main() {
    double num;
    printf("請輸入數值: ");
    scanf("%lf", &num); // 將輸入存入 double 型變數
    printf("輸入的數值: %f\n", num);
    return 0;
}

因此,在 scanf 中輸入倍精度浮點數時,必須使用「%lf」。若誤用「%f」,可能會導致非預期行為。

5. 使用「%lf」的注意事項

使用「%lf」時,尤其在 scanf 中,必須確保指定符與變數型態一致。若不一致,可能會導致非預期的結果或錯誤。

常見錯誤與正確用法

錯誤範例

以下程式碼中,float 型變數使用了 %lf,這是不正確的。

#include <stdio.h>

int main() {
    float num;
    printf("請輸入數值: ");
    scanf("%lf", &num); // 不正確的指定符
    return 0;
}

正確範例

正確的做法是使用 double 型變數搭配「%lf」。

#include <stdio.h>

int main() {
    double num;
    printf("請輸入數值: ");
    scanf("%lf", &num); // 正確的指定符
    return 0;
}

在使用 scanf 時,務必保持指定符與變數型態一致。

6. 與其他格式指定符的差異

了解「%lf」以外的格式指定符,也有助於根據需求選擇正確的用法。

常見格式指定符與用途

  • %f:用於 float 型資料(在 printf 中也可用於 double 型)
  • %Lf:用於 long double 型資料
  • %e / %E:用於科學記號(科學記數法)輸出

範例與差異說明

#include <stdio.h>

int main() {
    long double num_long_double = 3.14159265358979323846L;
    printf("long double 型輸出: %Lf\n", num_long_double); // long double 指定符
    printf("科學記號輸出: %e\n", num_long_double);        // 科學記號輸出
    return 0;
}

根據資料型態使用正確的指定符,可以提升輸出結果的精確度。

7. 總結

本文介紹了 C 語言中倍精度浮點數指定符「%lf」的用法,掌握以下要點可減少程式錯誤。

  • printf 函式:倍精度浮點數可用「%f」或「%lf」,但一般慣用「%f」。
  • scanf 函式double 型須用「%lf」,float 型須用「%f」,並確保型態與指定符一致。
  • 注意事項:在 scanf 中若指定符錯誤,可能導致非預期行為,因此務必匹配型態與指定符。