c語言輸入總結
以下內容透過本人利用試驗、Ollydbg跟蹤以及查閱網上有關資料得出。如有錯誤,請指正
編譯器版本:TDM-GCC 10。3。0
1。標準輸入輸出流與快取區
輸入分為兩種,一種稱為無緩衝輸入(或直接輸入),即你每輸入一個字元,程式就讀一個字元,並可立即使用這個字元;另一種稱為緩衝輸入,即將你一次性輸入的所有字元先收集並存到
緩衝區
(buffer)裡,在你按下 Enter 鍵之後將這些字元作為一個“塊”全部給到程式。
為什麼要使用緩衝區呢?
首先,把若干個字元作為一個塊來傳輸比逐個傳送字元更節約時間。其次,如果使用者打錯了字元,可以在輸入區域修正,確認無誤後按 Enter 鍵傳入正確的輸入。如果你使用的是無緩衝輸入,那麼一旦你打錯字,這個錯字元立刻就被傳入到程式裡了,這個時候想要改正就比較麻煩了。無緩衝輸入一般在互動性強的程式裡使用(比如實時遊戲)。
緩衝分為兩類:完全緩衝 I/O 和行緩衝 I/O。完全緩衝指的是當輸入區被填滿時才能重新整理緩衝區,通常出現在檔案輸入中;行緩衝指的是在出現換行符時重新整理緩衝區。
鍵盤輸入通常是行緩衝輸入,所以在按下 Enter 鍵後才重新整理緩衝區。
以上內容引用自知乎
青燈戲子:C 語言清空輸入緩衝區的幾個手段
而快取區作為一塊連續的記憶體,無論你輸入的是幾行,其實都是一行。
比如你輸入
1
2 3
4 5 6
在快取區裡,實際上是1\n2 3\n4 5 6\n
2。具體命令
a=getchar(); 這個命令完全等價於scanf("%c",&a);
作用是把快取區中第一個字元讀入a中
。
1\n2 3\n4 5 6\n ->上述命令 ->\n2 3\n4 5 6\n (a=1)
\n2 3\n4 5 6\n ->上述命令->2 3\n4 5 6\n (a=\n)
scanf("%s",str); 這個命令是讀入快取區中的字串,遇到\t 空格 \n等特殊字串後停止。
如果首先遇到的就是\n \t之類的字元,那就先刪去這類字元,然後讀取到字串,那些字元就不放回去了。
adb\nas dsa\n ->上述命令->\nas dsa\n
\nas dsa\n->上述命令->as dsa\n-> dsa-> dsa\n (str=“as”)
gets(str); 這個命令是讀取字串,遇到\n停止,並把遇到的\n刪除。這就和scanf不相同了。
adb\nas dsa\n ->上述命令->as dsa\n(str=adb)
as dsa\n->上述命令->(str = as dsa)
scanf("%s\n",str);這個命令這個命令是讀入快取區中的字串,遇到\t 空格 \n等特殊字串後停止。
如果首先遇到的就是\n \t之類的字元,那就先刪去這類字元,然後讀取到字串,那些字元就不放回去了。並且,刪除掉所讀字串後所有\n
adb\n\n\n\n\n ->上述命令->(str=adb)
scanf("%d",str),這個命令這個命令是讀入快取區中的數字,如果首先遇到的就是\n \t之類的字元,那就先刪去這類字元,然後讀取到數字後,再把之前刪去的字元放回快取區。
\n12\n->上述命令->\n\n(str=12)
還有其他組合,\n與%d的組合,這些大家自己根據上面的規律推一推吧、