1. 返回值說明
scanf函數會返回成功匹配并賦值的輸入項個數,而不是返回輸入的數據。
可以通過檢查返回值數量來確認輸入是否成功。若返回值與預期不符,就表明輸入存在問題。
#include <stdio.h>int main() {int num;if (scanf("%d", &num) != 1) { //1是指scanf 函數返回成功匹配并賦值的輸入項個數printf("輸入無效,請輸入一個整數。\n");return 1;}printf("你輸入的整數是: %d\n", num);return 0;
}
}
2. 地址傳遞
給?scanf?函數傳遞變量時,要傳遞變量的地址(即使用?&?運算符),這樣?scanf?才能把輸入的值存儲到變量所在的內存位置。
#include <stdio.h>int main() {int num;// 正確用法scanf("%d", &num);// 錯誤用法:scanf("%d", num); return 0;
}
3. 輸入緩存區問題
scanf?讀取輸入后,輸入緩沖區可能會殘留一些字符(如用戶輸入了回車->換行符?\n),這可能會對后續的輸入操作產生影響。
#include <stdio.h>int main() {int num;char ch;scanf("%d", &num); //這里模擬用戶輸入整數后還按了回車getchar(); // 消耗掉輸入緩沖區的換行符/*
當用戶輸入整數并按下回車鍵時,回車鍵產生的換行符 \n 會留在輸入緩沖區里。
若不把這個換行符消耗掉,后續的 scanf("%c", &ch); 就會讀取到這個換行符,而非用戶輸入的字符。
getchar() 函數的作用就是從輸入緩沖區讀取一個字符,這里它讀取的就是換行符。*/scanf("%c", &ch); //&ch 表示把用戶輸入的字符存到 ch 變量的內存地址中。return 0;
}
4. 格式控制字符串
(1)匹配輸入
格式控制字符串要和輸入的數據類型相匹配。例如,讀取整數用?%d,讀取浮點數用?%f?等。
#include <stdio.h>int main() {int num;float f;scanf("%d", &num);scanf("%f", &f);return 0;
}
(2)空格和特殊字符
格式控制字符串里的空格、制表符和換行符會匹配輸入中的任意空白字符序列。其他非格式說明符的字符必須和輸入中的字符精確匹配。
#include <stdio.h>int main() {int a, b;// 輸入時需要輸入 a=1 b=2 這樣的格式scanf("a=%d b=%d", &a, &b);
/*
注意如果平時只需要輸入一個值,則后面不要加空格。
即:scanf("%d ", &a); 這種寫法是?錯誤的
*/return 0;
}
5. 防止緩沖區溢出
使用?scanf?讀取字符串時(%s),要留意防止緩沖區溢出。可以使用寬度限定符來限制讀取的字符數量。
#include <stdio.h>#define MAX_LENGTH 10int main() {char str[MAX_LENGTH];// 最多讀取 MAX_LENGTH - 1 個字符,為字符串結束符 '\0' 留位置scanf("%9s", str); return 0;
}
6. 不同類型的混合使用
要注意輸入格式和順序,防止出現意外結果。
#include <stdio.h>int main() {int num;char str[10];// 先輸入整數,再輸入字符串scanf("%d %s", &num, str); return 0;
}
7. 錯誤處理
scanf?函數可能會因為輸入不匹配、文件結束等原因失敗,要對這些情況進行適當的錯誤處理。
#include <stdio.h>int main() {int num;if (scanf("%d", &num) != 1) {if (feof(stdin)) {printf("輸入結束。\n");} else {printf("輸入錯誤。\n");}return 1;}return 0;
}
?因為今天又在scanf函數上栽了跟頭,所以今天終于決定將scanf容易踩的抗自我做一個總結。以上是自己結合AI還有自己的一些理解寫的一些總結。如果有不足處,歡迎評論區指出,如果對你有幫助,那可以給我一個👍贊嗎