C-Scanf連續調用多次並且存在%c的問題

來源:互聯網
上載者:User

標籤:

問題現象:

當程式中存在多個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的問題

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.