1. 程式人生 > >scanf,printf函數細節

scanf,printf函數細節

包含 空白 rac 百分比 小數 題目 什麽 進制 字符串序

今天筆試的時候遇到一個考察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,改變數據的類型。

scanf,printf函數細節