# 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 語言的大部分語法和特性**,並在此基礎上添加了許多新的特性,例如物件導向程式設計、模板等等的。