一、scanf入門
scanf是C和C++中的輸入函數之一,其作用是將標準輸入(鍵盤輸入)的數據輸入到程序中,常用於讀取用戶輸入的數據。
在C++中可通過以下頭文件包含scanf函數:
#include <cstdio>
下面是scanf的基本用法:
scanf("%類型控制符", &變量名);
其中,類型控制符是指用來描述需要輸入的數據類型的符號,例如:%d表示整型,%f表示浮點型,%c表示字符型,%s表示字符串型等。&符號表示該變量的地址,即變量所在內存區域的首地址。
例如,我們需要輸入一個整數num並將其存儲在變量a中,那麼可以這樣寫:
int num; scanf("%d", &num);
這段代碼會在鍵盤輸入一個整數,然後將該整數賦值給變量num。如果輸入的數據類型與類型控制符不匹配,則會導致結果無法預測。
二、scanf常見錯誤
在使用scanf時有一些常見的錯誤需要避免。
1. 輸入緩衝區滯留
scanf函數輸入時會自動跳過空格、換行符等空白字符,從而讀取標準輸入中的有效數據。但如果輸入的數據類型與類型控制符不匹配,輸入緩衝區中的數據不會被清除,導致後續的輸入操作出現錯誤。
例如:
int a, b; scanf("%d", &a); scanf("%c", &b);
此時如果輸入的是”12a”,那麼a會被賦值為12,但b會被賦值為換行符,而不是’a’。這是因為在第一行輸入後,緩衝區中仍然有一個字符’a’,第二個 scanf 函數會從輸入緩衝區中讀取,而無視當前輸入的字符。
為避免這個問題,可以在類型控制符前面加上空格,讓scanf函數在讀取有效數據後跳過空格和換行符。例如:
int a, b; scanf(" %d", &a); scanf(" %c", &b);
加上空格後,scanf函數就會跳過空格和換行符,直接讀取下一個有效字符。
2. 輸入中包含非數字字符
如果輸入的數據中包含了非數字字符,那麼 scanf 函數會讀取輸入中的數字字符,並將其轉換成整數,導致結果不準確。
例如:
int a; scanf("%d", &a);
如果輸入的數據形如“12a”,那麼 a 的值會被賦值為12,而不是“12”字符串對應的整數。
為了避免這個問題,可以在輸入前用 getchar 函數清空輸入緩衝區,將所有非數字字符讀取並丟棄。
例如:
int a; char c; while((c = getchar()) == ' ' || c == '\n' || c == '\t'); ungetc(c, stdin); // 將讀取的非數字字符放回輸入緩衝區 scanf("%d", &a);
三、scanf進階用法
scanf還有一些高級用法,可以用於讀取不同類型的數據。
1. 讀取字符串
要讀取一個字符串,可使用%s類型控制符:
char str[100]; scanf("%s", str);
由於scanf函數在讀取字符串時會自動跳過空白字符,因此可以直接使用%s讀取字符串。
如果字符串中含有空格,則scanf函數只會讀取空格前的部分,這可能導致字符串內容不完整。為此,應該使用fgets函數來讀取字符串,它可以讀取一整行文本,包括空格。
2. 讀取多組數據
有時候需要從標準輸入中讀取多組數據,可以使用循環結合scanf來實現。
int a; while(~scanf("%d", &a)) { // 處理變量a }
在讀取多組整數時,如果輸入流中沒有更多的數據,scanf函數會返回-1,循環就會結束。
3. 控制輸入格式
有時候需要控制輸入數據的格式,可以使用scanf函數的轉換說明符。
int a, b; scanf("(%d,%d)", &a, &b);
該代碼可以讀取形如“(3,4)”這樣的字符串,並將括號裡面的數字讀取到變量a和b中。
4. 輸入換行符
輸入換行符可以使用%c類型控制符:
char c; scanf("%c", &c);
但如果在scanf函數前存在 getchar 函數,則需要先調用 getchar 函數以清空輸入緩衝區,否則scanf函數會將換行符作為有效字符處理。
char c; getchar(); // 清空輸入緩衝區 scanf("%c", &c);
總結
本文對C++中的scanf函數進行了詳細的講解。我們學習了scanf函數的基本用法,包括類型控制符、地址符等參數,以及scanf函數的常見錯誤和解決方法。此外,還介紹了scanf函數的進階用法,包括讀取字符串、讀取多組數據、控制輸入格式和輸入換行符等。相信掌握了這些知識,大家可以更加熟練地使用scanf函數來讀取用戶輸入的數據了。
原創文章,作者:小藍,如若轉載,請註明出處:https://www.506064.com/zh-hant/n/297140.html