scanf(%d,&x)在緩沖區讀取有個特點:
當輸入abc123按回車后:
scanf開始讀取,發現第一個不是數字,那么它就停止,表示一個資料都沒讀取,所以回傳失敗,
當輸入123abc按回車后:
scanf開始讀取,先是1,然后是2,然后是3,然后讀取a,發現a不是數字就停止讀取,這個時候scanf已經讀到字符123了,并把這一串字符轉化成整形資料存盤到x對應的地址中,所以回傳成功,
所以這就會導致一些非常有意思的現象,比如三子棋游戲里面玩家下棋的一段代碼:

如果輸入字母或者/+=等非數字的字符則會出現死回圈的情況:

這是因為scanf發現第一個不是數字,那么他就停止,因此xy里面的資料是一開始創建的隨機值:

由于緩沖區中是一個字母,這樣每次回圈都會讀取失敗,所以就陷入了死回圈,
另外getchar()這個函式可以讀取緩沖區中的字符,因此如果加入這些代碼即可避免陷入死回圈:

這句話的意思是讀取緩沖區中的字符,讀取完換行符'\n'后停止,注意這里的while (getchar() != '\n')是放在scanf前面的,第一次回圈scanf由于無法讀取字符a會讀取失敗,然后列印“坐標非法,請重新輸入”,當第二次進入回圈時,while (getchar() != '\n')會將緩沖區中的字符a和’\n'讀取掉,由于緩沖區中沒有可讀取的字符了,所以scanf會停下來等我們往緩沖區中輸入字符并且讀取,
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/292809.html
標籤:其他
上一篇:清華學姐閑來無聊python寫的2048小游戲 —環境搭建+游戲效果展示
下一篇:從0到1帶你實作掃雷!
