# 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 ->失敗
```