# L3 - Standard I/O ###### tags: `C` ## 一 . Printf ### (一) . Printf的參數組成 ```c= printf(string, expression1,expression2); ``` 1. 格式化字串:包含你要輸出的內容和格式化內容。 2. 表達式 : 後面可以接上任何的表達式所表示的值。 ### (二) . 格式化字串 1. conversion specifications : 包含『%』開始的字串。 - 『%d』 : 用於字元、整數。 - 『%f』 : 用於單精準浮點數,精準到小數點後6位。 2. Compiler不負責的部分 : - conversion specifications 和後面表達式的對應。 - conversion specifications 是否對應適當得資料型態。 - 用錯『%d』到『float』 : 用二補數的方式讀取IEEE-741。 3. 整數下conversion specifications 格式 : 『%m.pd』或『%-m.pd』。 - m : minimum field width : 最小印出空間,一般向右對齊。 - p : precision, 對整數時,表示一定要印出幾位,多得的用0去補齊。 ```c= int i=9; printf("%d|%3d|%-3d|%5.3d|",i,i,i,i); //%5.3d:用五位印出,表示三位,多得用0。 //output :9| 9|9 | 009| ``` 4. 浮點數下conversion specifications : 『%m.pX』或『%-m.pX』。 - 『%f』 : 『+-m』為向左或向右靠齊,且用m格印出,似整數;『.p』代表精確度要到小數點下第幾位。 - 『%e』 : 科學記號印出。『+-m』為向左或向右靠齊,且用m格印出,似整數;『.p』代表非10次方部分精確度要到小數點下第幾位 。 - 『%g』 : 自動辨別長度,會印出剛好長度的浮點數。『+-m』為向左或向右靠齊,且用m格印出,似整數;『.p』代表非10次方部分精確度要到小數點下第幾位 ```c= float x=892.12; printf("%f,%.3e,%g",x,x,x); //output:892.120000,8.912e+02,892.12 ``` ### (三) . 跳脫字元 1. 目的 : 印出沒辦法表示的字元,或已經被使用的特殊字元。 - 『\a』 : alert,會發出聲音。 - 『\b』 : 刪除前面一個字元。 - 『\n』 : 換行。 - 『\t』 : 以固定長度印出內容。 2. 特殊字元的跳脫 : - 『\\』 : 印出『\』。 - 『\"』 : 印出『"』。 - 『\'』 : 印出『'』。 ## 二 . scanf ### (一) . scanf的參數組成 ```c= scanf(string, address of variable1 ,address of variable2); ``` 1. 格式化字串:包含你要輸出的內容和格式化內容。 2. 變數 : 後面可以接上變數的位址。 ### (二) . 變數 1. 變數data type對應的conversion specification必須配對一樣。 - compiler不負責。 - 否則會讀取錯誤。 ```c= int num; scanf("%d",&num); scanf("%f",&num); ``` 2. 變數data type需要加上位址運算子。 - compiler不負責。 ### (三) . 格式化字串與輸入方式 1. conversion specification : 同printf得的規定。 - 『%d』: 整數。 - 『%ld』: 長整數。 - 『%f』: 單精準浮點數。 - 『%lf』: 雙精準浮點數。 - 『%c』: 字元。 - 『%s』: 字串。 1. 分割方式 : 會自動切割輸入的字元,以每一個空格、換行、tab字元分割。 2. 回傳方式 : 成功回傳一,失敗回傳零。 3. 讀取方式 : - 讀取整數 : 遇到『+-或數字』後,一直讀直到『.或非數字(包含正負)』。 - 讀取浮點數 : 遇到『+-或數字』後,開始讀到『.』後,可以再讀入『e或E』,再讀入『+-與數字』。 ```c= scanf("%d%d%f%f", &i, &j, &x, &y); //input one : 1 -20 .3 -4.0e3 //input two : 1-20.3-4.0e3 都一樣。 ``` 5. 正常字串 : 於scanf中輸出正常字串,代表必須輸入的字元內容。 - 若沒有剛好匹配要求的內容,直接結束,不往往下讀入,但之前讀的都存在。 - 空格 : 代表scanf會忽略所有的空白,直到讀到可以用的。 ```c= int x,y; scanf("%d/%d",&x,&y); //input 2/3 ->正確 2 4 ->失敗 ```