C語言scanf 函式的詭異事件

2021-08-18 03:36:47 字數 2185 閱讀 7047

(1) 首先看乙個程式 :

發現了乙個問題: 「scanf()函式吃掉了後面的資料」 .

(2) scanf()函式接收資料時

, 遇到以下情況將會結束乙個資料的輸入

:① 遇空格、回車、跳格鍵 .

② 遇寬度結束 .

③ 遇非法輸入 .

*所以上面的例子中遇到空格

scanf()

函式將認為是對

str1

的賦值結束

, 並忽略後面的」love you」, 不過」love you」還在鍵盤緩衝區中,

(3) 測試程式 :

#include

#include

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

序在某個字元前的所有字元作為乙個資料的值 :

C語言 scanf 函式

scanf 函式是用來從外部輸入裝置向計算機主機輸入資料的。scanf 函式的一般格式 案例 已知圓柱體的底半徑radius 1.5,高high 2.0,求其體積。main 案例 已知圓柱體的底半徑為radius,高為high,求其體積。功能 說明函式scanf 的格式及作用。main 程式執行結果...

C語言scanf函式

四 注意事項 編寫程式的主要目的就是為了處理資料。資料從 來?資料的 有很多種方式,如從磁碟檔案中讀取資料 從資料庫中讀取資料 從網頁中抓取資料等,還有一種原始的方式就是從鍵盤輸入資料。在c語言中,有三個函式可以從鍵盤獲得使用者輸入。getchar 輸入單個字元,儲存到字元變數中。gets 輸入一行...

C語言 scanf函式

1 scanf函式,是乙個標準的輸入函式 是乙個阻塞式的函式 當使用scanf的時候,程式會等待使用者輸入,如果不輸入內容,程式不再往下執行 作用 接收從鍵盤輸的的內容 2 使用格式 對比printf printf 格式控制字串 變數列表 scanf 格式控制字串 變數的 位址 列表 printf ...