C語言scanf()函式的詭異事件
(1) 首先看一個程式 :
發現了一個問題: “scanf()函式吃掉了後面的資料” .
(2) scanf()函式接收資料時, 遇到以下情況將會結束一個數據的輸入 :
① 遇空格、回車、跳格鍵 .
② 遇寬度結束 .
③ 遇非法輸入 .
*所以上面的例子中遇到空格scanf()函式將認為是對str1的賦值結束, 並忽略後面的”love you”, 不過”love you”還在鍵盤緩衝區中,
(3) 測試程式 :
#include<stdio.h> #include<windows.h> int main() { char str1[90]; char str2[90]; char str3[90]; scanf("%s",&str1); printf("%s\n",str1); Sleep(5000); // 要程式暫停5000毫秒 scanf("%s",&str2); // 不是用來輸入的, 是讓程式對鍵盤緩衝區再掃描 scanf("%s",&str3); // 不是用來輸入的, 是讓程式對鍵盤緩衝區再掃描 printf("%s\n",str2); printf("%s\n",str3); return 0; } |
當輸入”i love you”時, 程式會先輸出”i”, 間隔5000毫秒後程序會繼續輸出”love you” .
(輸入”i love you”開始只會輸出”i”)
(等待5000毫秒後, 程式將中輸出”love you”)
* 鍵盤的所有輸入都在快取中, 只是scanf函式將第一個空格作為資料賦值的結束符號, 後面再使用多個scanf對緩衝區進行掃描的時候, 就能將所有的緩衝資料獲取, 並賦給變數 .
(4) 順便提提清空緩衝區操作 :
① fflush(stdin);
② rewind(stdin);
* 如果將上面這兩個的任意一個放到Sleep(5000)後面, 則程式只會輸出”i”, 後面兩個scanf()不會再掃描緩衝區的資料了, 只會等待使用者的輸入兩次才能結束程式 .
(5) “%[] 掃描字元集合” :
a. 該字符集是scanf的格式控制的一種, 類似”%d”、”%c”, 括號中就為需要匹配
的內容, 比如”%[a-z]”即為匹配小寫英文字母;
需要注意的是這樣的匹配只是從輸入的所有字元中從前向後找, 從第一個字元
起只有符合匹配要求才會繼續找, 遇到不符合要求則直接結束scanf函式, 所以
只要一開始就不符合則相當於沒輸入 .
b. 還可使用”^”, 使用”^”的作用是限制獲取的終點, 如”%[^a123]”則如果輸
入”sdfddgadasdsada123sdfdsfjsdjf”, 則匹配後只會將”sdfddg”作為輸入的內容, 所
以可知作用是將中括號中的任一個字元作為結束的終點 :
該格式最大的用處就是解決上面所出現的”scanf吃掉空格”現象, 既可以限制程
序在某個字元前的所有字元作為一個數據的值 :