當心你的終端輸入緩衝區裡遺留的炸彈!

2021-10-07 03:53:49 字數 884 閱讀 6644

來看乙個程式:

#include

int main (

int argc,

char

**ar**)

我這裡不談什麼緩衝區溢位,也和各種漏洞無關,我這裡說的僅僅是乙個操作習慣,或者說程式設計習慣問題。

問題,輸入abc會發生什麼?

看看答案:

[root@localhost ]

# ./a.out

abcbuf is: a

[root@localhost ]

# bc

bc 1.06.95

this is free software with absolutely no warranty.

for details type `warranty'.

^c(interrupt) exiting bc.

why??

很簡單,因為前台bash程序在exec了a.out之後,就把終端/dev/pts/0(或者別的)給了a.out,read(0,就是讀取的這個終端的資料:

然而a.out僅僅讀取1個字元,剩下的bc就會留在/dev/pts/0的輸入緩衝區了,當你輸入abc時,緩衝區裡有3個字元,當回車按下後,輸入緩衝區裡有4個字元:『a』,『b』,『c』,』\cr』,發生了下面的事情:

萬一你輸入的是:arm -rf /呢…

所以,在程式的最後,別忘了清空你的輸入緩衝區:

int c

while

((c =

getchar()

)!='\n'

&& c !=

eof)

;

浙江溫州皮鞋溼,下雨進水不會胖!

帶有緩衝區的字元輸入流

帶有緩衝區的字元輸入流 使用這個流的時候,不需要自定義char陣列,或者不用定義byte陣列,自帶緩衝 當乙個流的構造方法中,需要乙個流的時候,這個被傳進來的流叫做節點流,外部負責包裝的流,叫做包裝流,或者處理流。建立物件時 bufferedreader的構造方法特殊,要接受乙個reader型別的引...

c語言輸入輸出緩衝區的概念

輸入輸出緩衝區的概念 我想以乙個例子說明,比如我想把一篇文章以字串行的方式輸出到計算機顯示器螢幕上,那麼我的程式記憶體作為資料來源而顯示器驅動程式作為資料目標,如果資料來源直接對資料目標傳送資料的話。資料目標獲得第乙個字元,便將它顯示。然後從埠讀取下乙個字元,可是這時就不能保證資料來源向埠傳送的恰好...

cin的用法及清空輸入緩衝區問題

問題描述 輸入資料時希望有個合法性檢驗的問題,如果輸入的資料不合法則程式提示重新輸入。最初 如下 include include using std cin using std cout using std endl using std vector int main while ivec.size...