1. 程式人生 > >C語言scanf()函式的詭異事件

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吃掉空格現象, 既可以限制程

序在某個字元前的所有字元作為一個數據的值 :