您當前的位置:首頁 > 體育

c語言輸入總結

作者:由 虛無 發表于 體育時間:2021-12-07

以下內容透過本人利用試驗、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的組合,這些大家自己根據上面的規律推一推吧、

標簽: 字元  DSA  str  輸入  命令