scanf,printf函數細節

今天筆試的時候遇到一個考察C語言scanf函數的題目
int x;
float y;
scanf("%3d%f",&x,&y);
// input 123456 678 enter and then what's the value of x and y
printf("%d %f",x,y);
程序的執行結果是:
123 456.0000000
看來還是自己對scanf函數不是很瞭解,現在看看scanf函數的描述如下:


格式:既字符串序列,它控制從流中取出的字符是如何處理的。
 空白字符:函數會讀取並且忽略下一個非空白字符之前的任何一個空白字符(包括空格,換行,tab等字符)。格式字符串中的單個
空白字符使得從流中提取的任意數量的空白字符爲一個。
非空白字符,除了格式指定(%):任何一個既不是空白字符又不是格式指定符中的部分(%開頭的)會導致函數讀取流中的下一個字符,
函數會比較該非空白字符和流中的字符,如果相等就拋棄這個字符並且讀取下一個字符,如果不相等函數失敗,返回,並且剩下的
子串沒有讀取。
格式說明符:一個由一個初始的百分比符號(%)形成的序列表示一個格式說明符,它用於指定從流中返回並且存儲在在附加參數指定的
地址中的數據的類型和格式。
%[*][width][length]specifier 


width:指定當前讀操作所能讀取的最大字符數目。
length:改變附加參數所指向存儲區域的類型, 只能在hh, h, l, ll, j, z, t, L中選擇一個。


在printf函數中,這個式子稍微有所不同,如下所示:
%[flags][width][.precision][length]specifier 


flags:-,+,#,0,其中’-’用於左對齊,默認是右對齊;’-’用於給數字添加正負號;’#’用於%#o,%#x,%#X,這樣給打印出的八進制,16進制添加前綴,o15,0x15;
’0’表示用0來替代對齊中的空格。
width:字符打印的時候指定最小的寬度,如果寬度不夠就用空格代替.width也可以使用‘*’代替,此時需要在附加參數中額外用一個參數來指定*所
表的數組,示例如下:
printf("%*d%*d\n",7,5,3,4);
printf("%7d%3d\n",5,4);
這兩行代碼執行的結果完全相同。
.precision:小數點後對應的數字數目,如果不足的用0代替。也可以使用‘*‘來代替具體的數字,但是此時要在附加參數中指定‘*‘所指代的數字。
length:這個類似scanf中的length,就是用來修飾%後面的specifier,改變數據的類型。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章