
- C程式設計教程
- C語言 - 首頁
- C語言基礎
- C語言 - 概述
- C語言 - 特性
- C語言 - 歷史
- C語言 - 環境搭建
- C語言 - 程式結構
- C語言 - Hello World
- C語言 - 編譯過程
- C語言 - 註釋
- C語言 - 詞法單元
- C語言 - 關鍵字
- C語言 - 識別符號
- C語言 - 使用者輸入
- C語言 - 基本語法
- C語言 - 資料型別
- C語言 - 變數
- C語言 - 整數提升
- C語言 - 型別轉換
- C語言 - 型別強制轉換
- C語言 - 布林值
- C語言中的常量和字面量
- C語言 - 常量
- C語言 - 字面量
- C語言 - 轉義序列
- C語言 - 格式說明符
- C語言中的運算子
- C語言 - 運算子
- C語言 - 算術運算子
- C語言 - 關係運算符
- C語言 - 邏輯運算子
- C語言 - 位運算子
- C語言 - 賦值運算子
- C語言 - 一元運算子
- C語言 - 自增和自減運算子
- C語言 - 三元運算子
- C語言 - sizeof 運算子
- C語言 - 運算子優先順序
- C語言 - 其他運算子
- C語言中的決策
- C語言 - 決策
- C語言 - if 語句
- C語言 - if...else 語句
- C語言 - 巢狀 if 語句
- C語言 - switch 語句
- C語言 - 巢狀 switch 語句
- C語言中的迴圈
- C語言 - 迴圈
- C語言 - while 迴圈
- C語言 - for 迴圈
- C語言 - do...while 迴圈
- C語言 - 巢狀迴圈
- C語言 - 無限迴圈
- C語言 - break 語句
- C語言 - continue 語句
- C語言 - goto 語句
- C語言中的函式
- C語言 - 函式
- C語言 - 主函式
- C語言 - 按值呼叫函式
- C語言 - 按引用呼叫函式
- C語言 - 巢狀函式
- C語言 - 變參函式
- C語言 - 使用者自定義函式
- C語言 - 回撥函式
- C語言 - return 語句
- C語言 - 遞迴
- C語言中的作用域規則
- C語言 - 作用域規則
- C語言 - 靜態變數
- C語言 - 全域性變數
- C語言中的陣列
- C語言 - 陣列
- C語言 - 陣列的特性
- C語言 - 多維陣列
- C語言 - 將陣列傳遞給函式
- C語言 - 從函式返回陣列
- C語言 - 可變長陣列
- C語言中的指標
- C語言 - 指標
- C語言 - 指標和陣列
- C語言 - 指標的應用
- C語言 - 指標運算
- C語言 - 指標陣列
- C語言 - 指向指標的指標
- C語言 - 將指標傳遞給函式
- C語言 - 從函式返回指標
- C語言 - 函式指標
- C語言 - 指向陣列的指標
- C語言 - 指向結構體的指標
- C語言 - 指標鏈
- C語言 - 指標與陣列
- C語言 - 字元指標和函式
- C語言 - 空指標
- C語言 - void 指標
- C語言 - 懸空指標
- C語言 - 解引用指標
- C語言 - 近指標、遠指標和巨指標
- C語言 - 指標陣列的初始化
- C語言 - 指標與多維陣列
- C語言中的字串
- C語言 - 字串
- C語言 - 字串陣列
- C語言 - 特殊字元
- C語言中的結構體和聯合體
- C語言 - 結構體
- C語言 - 結構體和函式
- C語言 - 結構體陣列
- C語言 - 自引用結構體
- C語言 - 查詢表
- C語言 - 點(.)運算子
- C語言 - 列舉(enum)
- C語言 - 結構體填充和打包
- C語言 - 巢狀結構體
- C語言 - 匿名結構體和聯合體
- C語言 - 聯合體
- C語言 - 位域
- C語言 - typedef
- C語言中的檔案處理
- C語言 - 輸入輸出
- C語言 - 檔案I/O(檔案處理)
- C語言預處理器
- C語言 - 預處理器
- C語言 - 預處理指令
- C語言 - 預處理器運算子
- C語言 - 宏
- C語言 - 標頭檔案
- C語言中的記憶體管理
- C語言 - 記憶體管理
- C語言 - 記憶體地址
- C語言 - 儲存類
- 其他主題
- C語言 - 錯誤處理
- C語言 - 可變引數
- C語言 - 命令執行
- C語言 - 數學函式
- C語言 - static 關鍵字
- C語言 - 隨機數生成
- C語言 - 命令列引數
- C程式設計資源
- C語言 - 問答
- C語言 - 快速指南
- C語言 - 速查表
- C語言 - 有用資源
- C語言 - 討論
C語言中的格式說明符
C語言中的格式說明符是在格式化控制檯I/O函式(如printf()和scanf())以及格式化檔案I/O函式(如fprintf()和fscanf())中使用的一些特殊符號。
格式說明符由一個或多個預定義的字母數字字元序列後跟%符號組成。例如,%d、%s、%f、%lf等是一些在C語言中使用的格式說明符。
為什麼在C語言中使用格式說明符?
CPU以流的方式與輸入輸出裝置執行I/O操作。透過標準輸入流從標準輸入裝置(例如鍵盤)讀取的資料稱為stdin。類似地,透過標準輸出裝置傳送到標準輸出(即計算機顯示屏)的資料稱為stdout。
計算機以文字形式從流中接收資料,但是您可能希望將其解析為不同資料型別的變數,例如int、float或字串。類似地,儲存在int、float或char變數中的資料必須以文字格式傳送到輸出流。格式說明符符號正是為此目的而使用的。
printf()函式中的格式說明符
printf()函式是定義在stdio.h標頭檔案中常用的標準輸出函式。printf()函式的原型如下:
int printf(format_string, expr1, expr2, . . );
此函式的第一個引數是一個字串,其中穿插了一個或多個格式說明符。第一個引數之後可能還帶有一個或多個表示式作為引數。編譯器將每個格式說明符替換為其後續表示式的值。然後,生成的格式化字串將傳遞到輸出流。
示例
在下面的程式碼中,我們有一個int變數age和一個float變數percent。printf()函式列印這兩個變數的值如下:
#include <stdio.h> int main(){ int age = 18; float percent = 67.75; printf("Age: %d \nPercent: %f", age, percent); return 0; }
輸出
執行程式碼後,將產生以下輸出:
Age: 18 Percent: 67.750000
第一個變數的值替換第一個格式說明符%d。類似地,%f被percent變數的值替換。
scanf()函式中的格式說明符
格式說明符也用於將輸入流解析為所需型別的變數。以下示例重點介紹瞭如何操作。
示例
在此示例中,程式要求使用者輸入年齡和百分比值。它們分別儲存在int和float變數中。
#include <stdio.h> int main(){ int age; float percent; printf("Enter Age and Percent: \n"); scanf("%d %f", &age, &percent); printf("Age: %d Percent: %f", age, percent); return 0; }
輸出
執行程式碼並檢查其輸出:
Enter Age and Percent: Age: 4096 Percent: 0.000000
格式說明符型別
ANSI C定義了許多格式說明符。下表列出了不同的說明符及其用途:
格式說明符 | 型別 |
---|---|
%c | 字元 |
%d | 帶符號整數 |
%e 或 %E | 浮點數的科學計數法 |
%f | 浮點值 |
%g 或 %G | 與%e或%E類似 |
%hi | 帶符號整數(短整型) |
%hu | 無符號整數(短整型) |
%i | 無符號整數 |
%l 或 %ld 或 %li | 長整型 |
%lf | 雙精度浮點數 |
%Lf | 長雙精度浮點數 |
%lu | 無符號整型或無符號長整型 |
%lli 或 %lld | 長長整型 |
%llu | 無符號長長整型 |
%o | 八進位制表示 |
%p | 指標 |
%s | 字串 |
%u | 無符號整型 |
%x 或 %X | 十六進位制表示 |
減號 (−) 表示左對齊。
%後面的數字指定最小欄位寬度。如果字串小於寬度,則將用空格填充。
句點 (.) 用於分隔欄位寬度和精度。
整數格式說明符
C語言使用%d表示帶符號整數,%i表示無符號整數,%ld或%li表示長整型,%o或%O表示八進位制表示,%x或%X表示整數的十六進位制表示。
示例
以下示例重點介紹瞭如何在C語言中使用整數格式說明符:
#include <stdio.h> int main(){ int num = 20; printf("Signed integer: %d\n", num); printf("Unsigned integer: %i\n", num); printf("Long integer: %ld\n", num); printf("Octal integer: %o\n", num); printf("Hexadecimal integer: %x\n", num); return 0; }
輸出
執行此程式碼後,將產生以下輸出:
Signed integer: 20 Unsigned integer: 20 Long integer: 20 Octal integer: 24 Hexadecimal integer: 14
浮點格式
C語言使用%f格式說明符表示單精度浮點數,%lf表示雙精度浮點數,%Lf表示長雙精度浮點數。要以科學計數法表示浮點數,C語言使用%e或%E說明符符號。
您可以以小數點後位數的形式指定寬度和精度。例如,要將數字寬度指定為4位,小數點後2位,請使用%4.2f格式。
示例
請看下面的例子:
#include <stdio.h> int main(){ float num = 5.347; printf("float: %f\n", num); printf("double: %lf\n", num); printf("Scientific notation: %e\n", num); printf("width and precision: %4.2f\n", num); return 0; }
輸出
執行此程式碼後,您將得到以下輸出:
float: 5.347000 double: 5.347000 Scientific notation: 5.347000e+000 width and precision: 5.35
字串格式
C語言中的char資料型別實際上是int資料型別的子集。因此,使用%c格式說明符的char變數對應於單引號中的字元。另一方面,如果您使用%d說明符,則char變數將被格式化為其ASCII值。
在C語言中,字串是char資料的陣列。要顯示char陣列,C語言使用%s說明符。
示例
請看下面的例子:
#include <stdio.h> int main(){ char ch = 'D'; char word[]="Hello World"; printf("As character: %c\n", ch); printf("As its ASCII value: %d\n", ch); printf("String format: %s", word); return 0; }
輸出
執行此程式碼後,將產生以下輸出:
As character: D As its ASCII value: 68 String format: Hello World
檔案I/O函式中的格式說明符
stdio.h庫定義了fscanf()和fprintf()函式,用於對磁碟檔案進行格式化I/O,而不是標準輸入/輸出流。
示例1
以下程式碼以寫入模式開啟檔案並將三個變數的值儲存到檔案中。
#include <stdio.h> int main(){ int x,y,z; FILE *fp = fopen("test.txt","w"); x = 10; y = 20; z = 30; fprintf(fp, "%d, %d, %d", x,y,z); fclose(fp); return 0; }
輸出
The fprintf() function uses the file represented by the file pointer fp to write the data.
下一個示例顯示如何以讀取模式開啟同一個檔案以讀取格式化資料。
示例2
以下程式透過以讀取模式開啟檔案來讀取檔案中的資料。
#include <stdio.h> int main(){ int x,y,z; FILE *fp = fopen("test.txt","r"); fscanf(fp, "%d, %d, %d", &x,&y,&z); printf("%d, %d, %d", x,y,z); fclose(fp); return 0; }
輸出
fscanf()函式從指向已開啟檔案的fp讀取格式化輸入。在這裡,您將得到以下輸出:
10, 20, 30