本篇為快速複習C語言系列之第二篇:格式化輸入與輸出。由於是複習用,所以並非針對完全零基礎的同學。當然,有其他編程底子的同學是可以的。 本篇著重講述 printf() 和 scanf() 。 ...
目錄
格式化輸入輸出函數
printf()
函數原型聲明:int printf(const char *format, ...);
其中 format 用法:%[修飾符]輸出格式字元
標準輸出格式字元表:
格式字元 | 說明 |
---|---|
d ,i |
十進位整數 |
x ,X |
十六進位無符號整數 |
o |
八進位無符號整數 |
u |
無符號十進位整數 |
c |
單一字元 |
s |
字元串 |
e ,E |
指數形式浮點小數 |
f |
小數形式浮點小數 |
g |
自動選擇 e 和 f 結果中較短的一種,且只保留有效數字 |
%% |
輸出百分號本身 |
Example:
int num = 2233;
printf("DEC: num = %d\nHEX: num = %x\nOCT: num = %o\n", num, num, num);
char ch = 120;
printf("Char: ch = %c\nStr: %s\n", ch, "ArchLinux");
float bi = 22.33;
printf("%%e: bi = %e\n%%f: bi = %f\n%%g: bi = %g\n", bi, bi, bi);
上述代碼輸出結果:
DEC: num = 2233
HEX: num = 8b9
OCT: num = 4271
Char: ch = x
Str: ArchLinux
%e: bi = 2.233000e+001
%f: bi = 22.330000
%g: bi = 22.33
修飾符表
修飾符 | 功能 |
---|---|
m |
設置輸出數據域寬,若數據長度 < m 左補空格,否則按實際輸出 |
.n |
對於實數,指定小數點後位數(四捨五入); 對於字元串,指定實際輸出位數 |
- |
輸出的數據在域內左對齊(不加此修飾符則預設為右對齊) |
+ |
指定在有符號數的正數前顯示正號 |
0 |
用於補齊的空格替換成 0 |
# |
在八進位數和十六進位數前顯示前導 0 ,0x |
l |
在 d , o , x , u 前,指定輸出精度為 long 型在 e , f , g 前,指定輸出精度為 double 型 |
為防止數據溢出,可以在常量數據後面添加字母來指定數據類型,比如 12L
表示 long 類型的 12
巨集定義一年的秒數,這個數肯定很大,防止溢出,可以寫作:
#define SEC_YEAR (60LL*60LL*24LL*365LL)
下列語句可以輸出該語句所在的函數以及在文件中的行號:
printf("[%s:%d]\n", __FUNCTION__, __LINE__);
scanf()
函數原型聲明:int scanf(const char *format, ...);
用 scanf()
接收字元串要註意不能有空格。字元串相關操作最好使用專門的字元串函數。
scanf() 返回值:返回正確接收到的數據個數。Upon successful return, these functions return the number of characters printed (not including the trailing '\0' used to end output to strings).
當多個輸入放在一起用時,可能會出現意想不到的結果,比如:
scanf("%d", &i);
scanf("%c", &ch);
printf("i = %d, ch = %d\n", i, ch); // ch = 10, ASCII 10 = LF
當輸入 i 的值按回車之後,所有的輸入都結束了,ch 輸出為 10,這是因為 ch 獲得了換行符,換行符的 ASCII 碼為 10。可以用抑制符解決這個問題:
scanf("%d", &i);
scanf("%*c%c", &ch);