C语言再学习 -- printf、scanf占位符
?
參看:printf()、scanf()用法總結及其格式轉換說明符
?
一、printf()
printf()的返回值為輸出的字符個數:
例:rv = printf ("hello"); ?結果為rv = 5;
?
其格式控制如下列表所述:?
表一、printf()格式轉換說明符
注意:不要忘記給控制字符串后面的列表中的每個項目都使用一個轉換說明。
| 轉換說明???? | 輸出 |
| %a | 浮點數、十六進制數和p-記數法(C99) |
| %A | 浮點數、十六進制數和p-記數法(C99) |
| %c | 一個字符 |
| %d | 有符號十進制整數 |
| %e | 浮點數、e-記數法 |
| %E | 浮點數、E-記數法 |
| %f | 浮點數、十進制記數法 |
| %g | 根據數值不同自動選擇%f或%e。%e格式在指數小于-4或者大于等于精度時使用 |
| %G | 根據數值不同自動選擇%f或%E。%E格式在指數小于-4或者大于等于精度時使用 |
| %i | 有符號十進制整數(與%d相同) |
| %o | 無符號八進制整數 |
| %p | 指針 |
| %s | 字符串 |
| %u | 無符號十進制整數 |
| %x | 使用十六進制數字0f的無符號十六進制整數 |
| %X | 使用十六進制數字0F的無符號十六進制整數 |
| %% | 打印一個百分號 |
表二、printf()格式轉換修飾符
| 修飾? | 意義 |
| 標志? | 五種標志(-、+、空格、#、0)詳細說明見表三。可以使用零個或者多個 |
| digit?或*? | 字段寬度的最小值。如果該字段不能容納要打印的數或者字符串,系統就會使用更寬的字段。當為? * 號時,表示從參數中獲取寬度。 |
| .digit或 .*??? | 精度。對于%e、%E和%f轉換,是將要在小數點的右邊打印的數字的位數。對于%g和%G轉換,是有效數字的最大位數。對于%s轉換,是將要打印的字符的最大數目。對于整數轉換,是將要打印的數字的最小位數,如果必要,要使用前導0來達到這個位數。只使用“."和使用“.0”相同,所以%f與%.0f相同。當為 * 號時,表示從參數中獲取精度。 |
| ?h | 和整數轉換說明符一起使用,表示一個short int 或 unsigned short int類型數值 |
| ?hh | 和整數轉換說明符一起使用,表示一個char 或 unsigned char類型數值 |
| ?j | 和整數轉換說明符一起使用,表示一個intmax_t或uintmax_t值 |
| ?l | 和整數轉換說明符一起使用,表示一個long nt 或 unsigned?long int類型數值 |
| ?ll | 和整數轉換說明符一起使用,表示一個long long int 或 unsigned?long long int類型數值(C99) |
| ?L | 和浮點轉換說明符一起使用,表示一個long double值 |
| ?t | 和整數轉換說明符一起使用,表示一個ptrdiff_t值(與兩個指針之間的差相對應的類型)(C99) |
| ?z???????????????? ?????????? | 和整數轉換說明符一起使用,表示一個size_t值(C99) |
表三、printf()格式轉換修飾標志
| 標志????? | 意義 |
| ? - | 項目是左對齊的 |
| ? + | 有符號的值若為正,則顯示正號;若為負的,則顯示負號 |
| ? 空格 | 有符號的值若為正,則顯示空格代替正號;若為負的,則顯示負號 |
| ? # | 使用轉換說明的可選形式。若為%o格式,顯示前導0;若為%x和%X格式,則顯示前導0x和0X。對于所有浮點形式,#保證了即使不跟任何數字,也打印一個小數點字符。對于%g和%G格式,它防止尾隨零被刪除。 |
| ? 0??????????????????? | 對于所有的數字格式,用前導0來填充字段寬度,如果出現-標志或者指定了精度(對于整數)則忽略該標志 |
?
關于字段寬度擴展:
printf可在字段寬度部分使用*代替數字來達到目的,但是也必須使用一個參數來說明函數字段寬度應該是什么。
例如:
int width = 8;
printf ("%*d", width, number);
?
?
?
?
二、scanf()
scanf() 開始讀取輸入以后,會在遇到的第一個空白制度空格(bank)、制表符(tab)或者換行符(newline)處停止讀取。
scanf()的返回值為成功輸入的項目個數,其控制格式如下列表所述
表四、scanf()格式轉換說明符
| 轉換說明符? | 意義 |
| ?%c | 把輸入解釋成一個字符 |
| ?%d | 把輸入解釋成一個有符號十進制整數 |
| ?%e、%f、 | 把輸入解釋成一個浮點數(%a是C99標準) |
| %E、%F、 %G、%A | 把輸入解釋成一個浮點數(%A是C99標準) |
| ?%i | 把輸入解釋成一個有符號十進制整數 |
| ?%o | 把輸入解釋成一個有符號八進制整數 |
| ?%p | 把輸入解釋成一個指針(一個地址) |
| ?%s | 把輸入解釋成一個字符串:輸入的內容以第一個非空白字符作為開始, 至下一個空白字符之前的全部字符 |
| ?%u | 把輸入解釋成一個無符號十進制整數 |
| ?%x、%X? | 把輸入解釋成一個無符號十六進制整數 |
?表五、scanf()格式轉換修飾符
| 修飾符 | 意義 |
| ?* | 忽略一個輸入項 |
| digit??????????????? | 最大字段寬度。在達到最大字段寬度或遇到第一個空白字符時停止對輸入項的讀取 |
| hh | 指示整數將會存儲在char 或 unsigned char |
| ll | 指示整數將會存儲在?long long 或者 unsigned long long (C99) |
| h、l、L | ”%hd“和”%hi“指示該值將會存儲在一個short int中。”%ho“、”%hx“”%hu“指示該值將會存儲在一個unsigned short int中。”%ld“和”%li“指示該值將存儲在一個long中。”%lo“、”lx“、”lu“指示該值將會存儲在一個unsigned long中。”%le“、”%lf“、”%lg“指示該值將會存儲在double中。將L與e、f、g一起使用指示該值將會存儲在long double中。如果沒有這些修飾符,d、i、o、x指示int類型,e、f、g指示float類型 |
| 空格 | 只能修飾 %c?, 忽略輸入的前導空白字符 |
?????? 對于scanf()除了%c以外,對每一個輸入項忽略其前導空白字符(空格、制表艝、換行符)。從第一個非空白字符開始,直到遇到空白字符或達到寬度或遇到當前輸入格式的非法字符時停止當前項輸入,進入下一輸入項
?
擴展:
1、當把*放在%和說明符字符之間時,它使函數跳過相應的輸入項目。
例如:scanf ("%*d %*d %d", &n);
輸入: 12 34 56
則會跳過前兩個整數,并把第三個整數復制個n
則輸出結果為: 56
2、巧用scanf()返回值
status = scanf ("%ld", &num);
while (status == 1){
status = scanf ("%ld", &num);
} ?/*當輸入整數則執行while循環,例如輸入Q,則scanf返回值為0,循環終止*/
也可用下列形式代替:
while(scanf ("%ld", &num) == 1) {}
3、變量參數的前面必須加上 "&" 符號。使用所有格式 (除了 %c 之外)時,輸入值之前的空白(空格、制表符、換行符等)會被跳過,值后面的空白表示該值的結束。因此,用%s 格式碼輸入字符串時,中間不能包含空白。
4、再論printf() 函數
聲明:
int printf(const char *format, ...)
參數:
format -- 這是字符串,包含了要被寫入到標準輸出 stdout 的文本。它可以包含嵌入的 format 標簽,format 標簽可被隨后的附加參數中指定的值替換,并按需求進行格式化。
5、斜杠:"/" 與 反斜杠:"\"??
printf("%d%d%d\n", x,y,\z)注意這里是反斜杠:"\"??
?
簡單總結:
數據類型和占位符之間的對應關系
char和unsingned char ? ? %c
short ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?%hd
unsigned short ? ? ? ? ? ? ? ? %hu
long ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? %ld
unsigned long ? ? ? ? ? ? ? ? ?%lu
int ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?%d
unsigned int ? ? ? ? ? ? ? ? ? ? %u
float ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? %f/%g
double ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? %lf/%lg
%f和%lf會保留小數點后面多余的0 ? 如 3.1400000 ? .2%f得 3.14
%g和%lg不會保留 ? 如 3.14
%02d 兩位數,如果不夠前面補0, 如 02
總結
以上是生活随笔為你收集整理的C语言再学习 -- printf、scanf占位符的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Word2Vec学习笔记(三)续
- 下一篇: Linux下安装ElasticSearc