# scanf
## 1. scanf是????
`scanf` 是 `C` 語言中(C++也適用)用來從標準輸入(鍵盤之類的)讀取數據的函式。它允許程式接收使用者輸入的數值並存儲到變數中。
## 2. 基本語法
```c=
#include <stdio.h>
int main() {
int number;
printf("請輸入一個整數: ");
scanf("%d", &number);
printf("你輸入的數字是: %d\n", number);
return 0;
}
```
### 說明:
1. `scanf("%d", &number);` 會從標準輸入讀取一個整數並存入 `number` 變數中。
2. `&number` 是取變數 `number` 的記憶體位址,讓 `scanf` 能夠將讀取的值存入該變數。
* 這部分因為攸關 `pointers` (指標),所以各位可能會不太理解,但是由於這裡是在介紹 `scanf` ,所以不多做贅述,那會在 `pointers` 做細部說明的。
## 3. 常見格式化符號
格式符號 | 說明 | 例子 |
|---------|----------|---------------------|
| `%d` | 讀取整數 | `scanf("%d", &x);` |
| `%f` | 讀取浮點數 | `scanf("%f", &y);` |
| `%lf` | 讀取雙精度浮點數 | `scanf("%lf", &z);` |
| `%c` | 讀取單一字元 | `scanf("%c", &ch);` |
| `%s` | 讀取字串 | `scanf("%s", str);` |
## 4. 讀取多個輸入
`scanf` 可以一次讀取多個變數,例如:
```c
#include <stdio.h>
int main() {
int a, b;
printf("請輸入兩個整數: ");
scanf("%d %d", &a, &b);
printf("你輸入的數字是: %d 和 %d\n", a, b);
return 0;
}
```
## 5. 讀取字串時的注意事項
使用 `%s` 讀取字串時,`scanf` 預設會以空白(空格、換行、Tab)作為分隔符,因此無法直接讀取含空格的字串。
```c
#include <stdio.h>
int main() {
char name[50];
printf("請輸入你的名字: ");
scanf("%s", name);
printf("你的名字是: %s\n", name);
return 0;
}
```
> **注意**:如果輸入 "high school",`scanf("%s", name);` 只會讀取 "high"。
解決方案:使用 `fgets` 或 `scanf(" %[^\n]", str);`
```c
#include <stdio.h>
int main() {
char name[50];
printf("請輸入你的全名: ");
fgets(name, 50, stdin); //意思是至多可以讀取50個字元
printf("你的名字是: %s", name);
return 0;
}
```
## 6. 避免輸入錯誤
當 `scanf` 讀取的格式與輸入數據不符時,可能會導致錯誤輸入。例如:
```c
#include <stdio.h>
int main() {
int num;
printf("請輸入一個整數: ");
if (scanf("%d", &num) != 1) {
printf("輸入錯誤!請輸入有效的整數。\n");
} else {
printf("你輸入的數字是: %d\n", num);
}
return 0;
}
```
## 7. 進階應用
### 讀取換行字元
當 `scanf` 讀取數值後,換行 `\n` ('\n'的細則可至講義跳脫字元) 仍然留在輸入緩衝區,可能影響下一次的輸入:
```c
#include <stdio.h>
int main() {
int age;
char name[50];
printf("請輸入年齡: ");
scanf("%d", &age);
getchar(); // 清除輸入緩衝區的換行字元
printf("請輸入名字: ");
fgets(name, 50, stdin);
printf("年齡: %d, 名字: %s", age, name);
return 0;
}
```
## 8. 結論
`scanf` 是 C 語言中重要的輸入函式,但使用時需要注意:
- **變數的地址**(使用 `&` reference)
- **格式化符號的正確使用**
不過不過 `scanf` 和 `printf`,我並不常用,通常只有在輸出小數點後幾位等等的情況才會使用。
eg.
```cpp=
#include <stdio.h>
int main(){
float a;
scanf("%f", &a);
printf("哈哈 %.4f", a);
}
```
輸入:
`3.1415926`
輸出:**四捨五入**
```markmap
哈哈 3.1416
```
## 為什麼C語言的東東可以在C++使用?!?!
因為C++ 是在 C 語言的基礎上發展而來的,它**保留了 C 語言的大部分語法和特性**,並在此基礎上添加了許多新的特性,例如物件導向程式設計、模板等等的。