標籤:
問題現象:
當程式中存在多個scanf時,針對第一個scanf的輸入,一般使用者會以空白字元(空格、換行、tab、換頁符)等結束。但若後面有一個scanf(“%c”,&ch),則剛才輸入的空白字元會被此次的scanf讀入,因此空白字元也是一個字元,此將導致ch為空白。
原因解釋:
scanf的工作原理:(一般情況,即格式串中沒有其它字元)使用者的任何輸入將被儲存在緩衝之中,當有scanf時,scanf則從此緩衝隊列中讀取字元,直至遇到空白字元或者是此字元不可能是本次的輸入為止,並把此字元放回原隊列,此字元成為隊列的第一個字元。當下一次scanf被調用時,將從第一個字元讀取,若此時為%d,%f,%g,%e等資料格式串,則可跳過空白字元,直至出現數字為止;若此時為%c等字元(串)格式串,則會把空白字元讀入,並給此變數賦值。
另外,若讀取到不可能是本格式串所代表的字元時,程式將異常退出。如scanf(“%d”,&num)時,輸入kk。
解決方案:
處理格式串中的一般字元,scanf採取的動作依賴於這個字元是否為空白字元。
l 空白字元:當在格式串中遇到一個或多個連續的空白字元時,scanf從輸入中重複讀取空白字元直至遇到一個非空白字元(把該字元放回原處)為止。格式串中的空白字元的數量無關緊要,格式串中的一個空白字元可以與輸入中任意數量(包括0個)的空白字元相匹配。
l 其它字元:當在格式串中遇到非空白字元時,scanf將把它與下一個輸入字元進行比較。如果兩個字元相匹配,那麼scanf會放棄輸入字元而繼續處理格式串。如果兩個字元不匹配,那麼scanf會把不匹配的字元放回輸入中,然後異常退出。例如,scanf(“%d/%d,&a,&b),輸入是5/96,則a=5,b=96。
歸納總結:
(1)若格式串中沒有其它字元,則讀入可能是本變數的所有輸入,直至明顯不是本變數的輸入。且非字元類型的格式串(如%d,%f,%g,%e)會跳過所有空白字元尋找第一個字元輸入,但字元類型的格式串(如%c)不會跳過空白字元。
(2)若格式串中有其它字元,則分為空白字元與非空白字元討論。
因此,上述問題可以使用scanf(“ %c”,&ch)解決。
C-Scanf連續調用多次並且存在%c的問題