## Scanf函數基本概念
### scanf函數介紹
- scanf函數是一個阻塞式函數
+ 程序會停在`scanf`函數出現的地方, 直到接收到數據才會執行后面的代碼
- scanf函數原型包含在標準輸入輸出頭文件`stdio.h`中,用于接受鍵盤輸入的內容。
+ 格式:scanf("格式控制字符串",輸入項地址列表);
+ 例如: scanf("%d", &num);
+ 格式控制字符串:
* 規定數據輸入的格式,由格式控制符和普通字符組成,格式控制符和百分號(%)一起使用,
用來說明輸入數據的數據類型(格式字符)。
+ 輸入項地址列表:
* 需要接收數據的變量地址,這些輸入項與格式控制字符串在類型和數量上要對應,當有多個 輸入項時,各個地址名之間以逗號“,”分隔。輸入格式和變量類型要保持一致。
> 在C語言中,一個變量的地址可以通過地址運算符&得到。例如:定義int a,b;則a,b的 地址為&a,&b
### scanf函數格式控制符
|格式|意義|
|--|--|
|d|輸入一個十進制整數|
|o|輸入一個八進制整數|
|x|輸入一個十六進制整數|
|i|輸入一個有符號或無符號的十進制、八進制、十六進制整數|
|u|輸入一個無符號十進制整數|
|f 、e或E、 g或G|輸入一個小數形式或指數形式的浮點數|
|c|輸入一個字符|
|s|輸入一個字符串|
- 獲取整形數據
```
// 1.定義變量用于接收輸入數據
int num = 0;
// 2.利用scanf函數接收用戶輸入數據
scanf("%d", &num);
// 3.打印驗證結果
printf("num = %d", num);
```
- 獲取實數型數據
```
// 1.定義變量用于接收輸入數據
float num = 0;
// 2.利用scanf函數接收用戶輸入數據
scanf("%f", &num);
// 3.打印驗證結果
printf("num = %d", num);
```
- 非法的輸入
+ 除"空格","回車","tab"之外, 如果輸入的數據和scanf接收的數據不匹配將會自動結束接收
## Scanf函數注意事項
### scanf使用注意事項
- 如果在輸入時,輸入了多個空格、回車、Tab都會被系統忽略的
- 如果要獲取的內容是多個整數,中間輸入了多個空格、回車、Tab都會被系統忽略
- 如果要獲取的內容是多個實型,中間輸入了多個空格、回車、Tab都會被系統忽略
- 非法的格式輸入,得不到想要的結果
- 混合整形和字符型數據接收
+ 當整形的數和字符混合輸入時,要避免“空格” 添麻煩
+ 為防止混合輸入空格造成的錯誤,可以通過添加普通的分隔符解決
- 關于使用"\n"的問題
+ scanf函數當遇到回車的時候,會結束執行
+ 所以在scanf中,盡量不要使用 \n
+ 如果在scanf中使用了\n, 需要原樣輸入"\n"
## Scanf函數實現原理
### scanf的運行原理
- 系統會將用戶輸入的內容了放入輸入緩沖區
- scanf方式會從輸入緩沖區中逐個取出內容賦值給格式符, 如果類型不一致不會修改原有數據
- 如果輸入緩沖區的內容不為空,scanf會一直從緩沖區中獲取,而不要求再次輸入