目錄
一、基本用法
二、占位符
基本用法
常用占位符
字符串占位符示例
多占位符示例
注意事項
三、占位符列表
基本數據類型占位符
浮點數占位符
特殊類型占位符
長度修飾符
使用示例
注意事項
四、輸出格式
1、限定寬度
基本用法
左對齊輸出
浮點數寬度限制
2、強制顯示正負號
3、控制小數精度
基本精度控制
結合寬度限制
動態參數指定
4、截斷字符串輸出
基本用法
特點
結合寬度限定
一、基本用法
????????printf() 函數用于將參數文本輸出到屏幕。函數名中的"f"代表"format"(格式化),表示該函數可以定制輸出文本的格式。
基本語法示例:
#include <stdio.h>
int main()
{printf("Hello World");return 0;
}
上述代碼會在屏幕上輸出一行文字"Hello World"。
注意事項:
-
printf() 不會自動在行尾添加換行符。運行結束后,光標會停留在輸出結束的位置,不會自動換行。
-
如需換行,可以在輸出文本的結尾添加換行符\n:
#include <stdio.h> int main() {printf("Hello World\n");return 0; }
-
若需要在文本內部換行,同樣可以通過插入換行符實現:
#include <stdio.h> int main() {printf("Hello\nWorld\n");/* 等價于 */printf("Hello\n");printf("World\n");return 0; }
重要說明:
-
printf() 函數定義在標準庫頭文件stdio.h中
-
使用該函數前,必須在源文件頭部引入此頭文件
二、占位符
printf()
?函數支持在輸出文本中使用占位符,這些占位符可以在運行時被具體的值替換。
基本用法
#include <stdio.h>
int main()
{printf("There are %d apples\n", 3);return 0;
}
說明:
-
There are %d apples\n
?是輸出文本,其中?%d
?是占位符。 -
占位符以百分號?
%
?開頭,后跟一個類型標識符(如?d
?表示整數)。 -
printf()
?的第二個參數?3
?會替換?%d
,最終輸出:There are 3 apples
常用占位符
占位符 | 類型 | 示例 |
---|---|---|
%d | 整數 | printf("%d", 10) |
%s | 字符串 | printf("%s", "abc") |
%f | 浮點數 | printf("%f", 3.14) |
%c | 單個字符 | printf("%c", 'A') |
字符串占位符示例
#include <stdio.h>
int main()
{printf("%s will come tonight\n", "zhangsan");return 0;
}
輸出:zhangsan will come tonight
多占位符示例
#include <stdio.h>
int main()
{printf("%s says it is %d o'clock\n", "lisi", 21);return 0;
}
說明:
-
第一個?
%s
?被?"lisi"
?替換 -
第二個?
%d
?被?21
?替換
輸出:lisi says it is 21 o'clock
注意事項
-
參數匹配規則:
-
占位符數量必須與后續參數數量嚴格匹配。
-
如果有?
n
?個占位符,printf()
?需要?n + 1
?個參數(包括格式字符串本身)。
-
-
錯誤示例:此類錯誤可能導致未定義行為(輸出亂碼或程序崩潰)。
printf("%d %s", 10); // 錯誤:缺少第二個參數
三、占位符列表
printf()
?提供多種占位符,對應不同的 C 語言數據類型。以下是常用占位符的完整參考:
基本數據類型占位符
占位符 | 類型 | 說明 | 示例 |
---|---|---|---|
%d | int | 十進制整數 | printf("%d", 10) |
%i | int | 同%d | printf("%i", 10) |
%u | unsigned int | 無符號十進制整數 | printf("%u", 10U) |
%o | int | 八進制整數 | printf("%o", 10) |
%x | int | 十六進制整數(小寫) | printf("%x", 255) ?→?ff |
%X | int | 十六進制整數(大寫) | printf("%X", 255) ?→?FF |
浮點數占位符
占位符 | 類型 | 說明 |
---|---|---|
%f | float/double | 十進制浮點數 |
%e | float/double | 科學計數法(小寫e) |
%E | float/double | 科學計數法(大寫E) |
%g | float/double | 自動選擇%f 或%e (更簡潔) |
%G | float/double | 自動選擇%f 或%E |
%a | float/double | 十六進制浮點數(小寫) |
%A | float/double | 十六進制浮點數(大寫) |
特殊類型占位符
占位符 | 類型 | 說明 |
---|---|---|
%c | char | 單個字符 |
%s | char* | 字符串 |
%p | void* | 指針地址 |
%n | int* | 不打印,存儲已輸出的字符數 |
%% | - | 輸出百分號字符 |
長度修飾符
可與基本占位符組合使用:
-
h
:short
(如%hd
) -
l
:long
(如%ld
) -
ll
:long long
(如%lld
) -
L
:long double
(如%Lf
) -
z
:size_t
(如%zd
)
使用示例
#include <stdio.h>int main()
{// 基本整數printf("Decimal: %d\n", 255); // 255printf("Octal: %o\n", 255); // 377printf("Hex: %x\n", 255); // ff// 浮點數printf("Float: %f\n", 3.14159); // 3.141590printf("Scientific: %e\n", 3.14159); // 3.141590e+00// 特殊類型printf("Character: %c\n", 'A'); // Aprintf("String: %s\n", "Hello"); // Helloprintf("Pointer: %p\n", main); return 0;
}
注意事項
-
類型必須嚴格匹配占位符
-
使用
%n
時要格外小心(可能引發安全問題) -
%%
用于輸出百分號字符本身
四、輸出格式
printf() 可以定制占位符的輸出格式。
1、限定寬度
printf()
?函數允許通過格式說明符限定輸出的最小寬度。具體用法如下:
基本用法
在占位符中指定最小寬度,當輸出內容不足該寬度時,默認會在左側填充空格(右對齊)。
示例:
#include <stdio.h>
int main()
{printf("%5d\n", 123); // 輸出為 " 123"(前面有2個空格)return 0;
}
說明:
-
%5d
?表示該整數的輸出寬度至少為5個字符 -
由于"123"只有3位,不足部分會在前面補2個空格
左對齊輸出
在寬度指示符前添加-
號可以改為左對齊(右側補空格)。
示例:
#include <stdio.h>
int main()
{printf("%-5d\n", 123); // 輸出為 "123 "(后面有2個空格)return 0;
}
浮點數寬度限制
對于浮點數,寬度限制會作用于整個數字(包括整數部分、小數點和小數部分)。
示例:
#include <stdio.h>
int main()
{printf("%12f\n", 123.45); // 輸出為 " 123.450000"return 0;
}
說明:
-
%12f
?表示浮點數至少占用12個字符寬度 -
默認情況下,
printf()
會輸出6位小數,因此實際輸出為"123.450000"(共10個字符) -
不足12位,所以在前面補2個空格
注意:當實際數值的寬度超過指定的最小寬度時,會按照實際寬度輸出,不會截斷數據。
2、強制顯示正負號
????????默認情況下,printf()
?僅在輸出負數時顯示?-
?號。若需強制顯示正數的?+
?號,可在占位符的?%
?后添加?+
?標志。
示例:
#include <stdio.h>
int main()
{printf("%+d\n", 12); // 輸出 "+12"printf("%+d\n", -12); // 輸出 "-12"return 0;
}
說明:
-
%+d
?格式確保數值始終帶有符號標識 -
適用于需要明確區分正負值的場景
3、控制小數精度
基本精度控制
通過?%.nf
?格式可指定小數位數(n 為要保留的位數):
#include <stdio.h>
int main()
{printf("Number is %.2f\n", 0.5); // 輸出 "Number is 0.50"return 0;
}
注意:
-
會自動進行四舍五入
-
不足位數補零(如?
%.3f
?輸出 "0.500")
結合寬度限制
可同時指定寬度和精度(格式:%寬度.精度f
):
#include <stdio.h>
int main()
{printf("%6.2f\n", 0.5); // 輸出 " 0.50"(頭部2空格)return 0;
}
說明:
-
%6.2f
?表示總寬度6字符,含2位小數 -
默認右對齊,不足寬度左側補空格
動態參數指定
使用?*
?占位符可通過參數動態設置寬度和精度:
#include <stdio.h>
int main()
{printf("%*.*f\n", 6, 2, 0.5); // 等效于 printf("%6.2f\n", 0.5)return 0;
}
特點:
-
第一個?
*
?對應寬度參數(示例中的6) -
第二個?
*
?對應精度參數(示例中的2) -
提高代碼靈活性,適合需要運行時確定格式的場景
4、截斷字符串輸出
? ? printf()
?函數可以通過?%.ns
?格式說明符來控制字符串的輸出長度,其中?n
?指定要顯示的最大字符數。
基本用法
#include <stdio.h>
int main()
{printf("%.5s\n", "hello world"); // 輸出 "hello"return 0;
}
說明:
-
%.5s
?表示只輸出字符串的前5個字符 -
原字符串 "hello world" 被截斷為 "hello"
-
不會修改原字符串,僅控制輸出內容
特點
-
安全截斷:不會導致緩沖區溢出
-
精確控制:可指定任意截取長度(不超過字符串實際長度)
-
格式靈活:可與最小寬度結合使用(如?
%10.5s
)
結合寬度限定
#include <stdio.h>
int main()
{printf("%10.5s\n", "hello world"); // 輸出 " hello"(右對齊)printf("%-10.5s\n", "hello world"); // 輸出 "hello "(左對齊)return 0;
}
注意:
-
當截取長度超過字符串實際長度時,按實際字符串長度輸出
-
常用于格式化表格輸出或固定長度顯示場景