乙個凶險的BUG

2021-09-09 04:39:28 字數 629 閱讀 4637

c格式符用來輸入單個字元(scanf()函式)。

char ch;

scanf("%3c",&ch);

如果從鍵盤連續輸入3個字元「abc」,由於ch只能容納乙個字元,系統就把第乙個字元'a'賦給字元變數ch。

果真如此麼?考察一下下面的**

#include

#include

int main( void )

執行的結果是:

最初__ch,_ch,ch為err

輸入3個字元:abc

最後__ch,_ch,ch為cba

請按任意鍵繼續. . .

不難發現,輸入的abc三個字元都被寫入了記憶體。意外地改變記憶體中的資料,這是非常危險的事情。就如同

int *p ;

*p = 3 ;

一樣凶險。

事實上,scanf()函式中的%c並非是用來輸入單個字元的,而是用來輸入一組字元的。例如

char c_a[3];

scanf("%3c" , c_a );

其中的3規定了輸入資料的寬度。

當然,寬度為1的時候,%c確實可以用來輸入單個字元。但是認為%c這個格式轉換只是「用來輸入單個字元」卻是大錯特錯,而且可能會產生乙個很嚴重的潛在的bug。

乙個凶險的BUG

c格式符用來輸入單個字元 scanf 函式 char ch scanf 3c ch 如果從鍵盤連續輸入3個字元 abc 由於ch只能容納乙個字元,系統就把第乙個字元 a 賦給字元變數ch。果真如此麼?考察一下下面的 include include int main void 執行的結果是 最初 ch...

微軟的乙個BUG

各位,我不知道我的這個發現屬不屬於微軟的乙個bug round 1.225,2 1.23 round 1.245,2 1.25 round 1.265,2 1.26 round 1.285,2 1.28 按照技術文章上說的,vb中round 函式屬於四捨五入函式,但實際執行當中,其實round 函式...

乙個微妙的bug

都知道不同型別運算元進行運算時,發生的轉換,資料型別一般朝著浮點度更高,長度更長的方向轉換,但signed 向unsigned 轉換得多多注意了,有如下 includeint a define cd sizeof a sizeof int sizeof 還回值為unsigned int main 最...