scanf易錯點解析
一、回車也被獲取了
例:
char a;
while(1)
{
scanf("%c",&a);
printf("getchar : %d\n", (int)a);
}
輸入:
1234
結果:
get char : 49 //1
get char : 50 //2
get char : 51 //3
get char : 52 //4
get char : 10 //\n(換行)
[解析:
scanf獲取字符時是一個一個獲取的,當輸入1234和一個回車鍵,總共5字符,所有分別取出這五個字符]
二、嚴格匹配字符串
scanf("1123%s",&str);
[輸入:1123aaabb時str為 aaabb,但是,輸入 24aabbdd時,會出錯,因為1123必須進行]
三、避免回車被自動獲取
例:
char a,b;
scanf("%c", &a);
scanf("%c", &b); //scanf(" %c", &b);
printf("a = 0x%d\nb = 0x%d\n", (int)a, (int)b);
輸入:
輸入1後回車。
結果:
a = 0x49
b = 0x10
[解析:
原因是a取了1,b取了\n
%c的前面必須有一個空格,否則系統會將你前面輸入別的值之後鍵入的回車符讀入該變量,造成死循環。當然,如果scanf("%c",&b)是第一條讀入語句,就可以不需要空格。]
四、限定讀取字符串大小
例:
char *p, str[20];
scanf("10%s", p);
scanf("%s", str);
[解析:
一旦輸入字符個數大於10,p就不再繼續讀入,而後面的一個讀入函數即scanf("%s", str)就會從第11個字符開始讀入。]
五、清空鍵盤緩沖區
fflush(stdin);
[解析:
清楚掉鍵盤緩沖區]