也許這也不能算是乙個bug,只不過沒有了解清楚乙個函式的確切用法罷了。這一切都源於乙個經典的程式:
#include
#include
int main(void)
return 0;
}當我輸入abcd'\n'的時候,輸出是abcd'\n',這很正常;
當我輸入ctrl+d(也就是eof),結束程式,這也很正常;
但是,如果我輸入abcd'eof'呢?結果會在當前行輸出abcd,按照道理,程式讀取到eof是會結束的嗎?這到底發生什麼事了?
如果沒有強大的除錯工具gdb的幫助下,也許這就一直是我乙個小小的困惑,但是gdb太好用了,所以我發現了問題的所在。
讓我先gdb一下吧:
先把斷點設定子line 8:break 8
接著run,display input和upper,你會發現這兩個字元是會有初始值的:
1: input = 0 '\000'
2: upper = 40 '('
然後,step,程式會進行while語句,由於input!=eof,所以會進行getchar函式,這時候可以輸入字元,我輸入
ab'eof'
神奇的事情發生了,當我輸入eof之後,程式立馬退出getchar函式,來到下一語句:
(gdb) s
ab10upper=toupper(input);
2: upper = 40 '('
1: input = 97 'a'我們可以看到這時候input已經接收了第乙個字元a
我們接著s:
(gdb) s
11putchar(upper);
2: upper = 65 'a'執行過toupper函式之後,upper等於字元a
1: input = 97 'a'
接著s,我發現這時候字元a並沒有輸出,而是直接跳至while迴圈:
(gdb) s
8while((input=getchar())!=eof)
2: upper = 65 'a'
1: input = 97 'a'
接著s,跟之前類似:
(gdb) s
10upper=toupper(input);
2: upper = 65 'a'
1: input = 98 'b'
接著s,還是跟之前類似:
(gdb) s
11putchar(upper);
2: upper = 66 'b'
1: input = 98 'b'
接著s,又跳至while迴圈,putchar還是沒有輸出:
(gdb) s
8while((input=getchar())!=eof)
2: upper = 66 'b'
1: input = 98 'b'
我們再接再厲,s一下:
這時候很神奇的是:終於有輸出了,是在輸入當前行輸出ab。
當我們直接輸入eof的時候,getchar馬上接收到eof訊號退出函式。
我再來乙個正常的例子來實驗一下,輸入為:ad'\n',結果發現
程式執行到最後乙個字元回車符的時候,就已經可以輸出了:
(gdb) s
11putchar(upper);
2: upper = 10 '\n'
1: input = 10 '\n'
(gdb) s
ad跳至while迴圈的時候已經有輸出了
8while((input=getchar())!=eof)
2: upper = 10 '\n'
1: input = 10 '\n'
我把上面的情況總結一下:
(1)getchar只認得第乙個輸入的eof,如果前面有多個字元後面接著乙個eof,則eof只會讓getchar函式結束,getchar不會接收eof,只接收前面輸入的字元;
(2)putchar不是馬上輸出字元,而是乙個乙個輸出,如果遇到回車,則輸出所有字元,但是如果是多個字元加乙個eof,情況就發生改變,執行完putchar並不馬上輸出,而是要執行至getchar函式後才輸出。
這實在是乙個難以解釋的bug。
不過,我猜測是這樣的:
getchar函式和putchar函式共同維護著同乙個緩衝區,getchar函式在執行之前會將緩衝區內部的所有資料清空並輸出,由於剛開始的時候緩衝區都是'\0',所以什麼也沒有顯示,我只能看到getchar正準備接收字元。putchar函式則會再遇到'\n' 的時候將緩衝區資料輸出,由於我們是多個字元後面接著eof,且eof沒有被getchar讀取,所以putchar再執行至最後乙個字元時仍然不輸出。直到再次執行getchar函式,它將緩衝區所有的字元輸出,所以我們看到輸出了。getchar只能認識第一次就輸入的eof,否則會讓其退出。
這便是我的猜測了,如果能看到源**,那問題就好辦多了。
MyEclipse除錯過程中遇到乙個奇怪的問題
雖然看著別人的 有些頭大,但是咱目標也不高,調通了就成。為了除錯方便,我將tomcat下配置的應用全都去掉了,想看看tomcat會不會報錯。在啟動tomcat時顯示某個應用目錄不存在,不是取消全部應用了嗎?找一找原來是server.xml中設定了context。刪掉這個配置,仍然報錯,找不到應用目錄...
測試過程中如何快速定位乙個bug
作為測試人員,和我們最常打交道的,莫屬bug。但是測試不只是負責發現問題,除了發現問題這種基本功外,定位問題,提出解決方案,提出預防方案也是要掌握的技能。如何快速定位乙個bug,就需要對功能 產品的流程 開發方案 開發人員非常熟悉。遇到乙個bug的時候,我們要去定位發現這個bug的 是屬於前端還是後...
測試過程中如何快速定位乙個bug
作為測試人員,和我們最常打交道的,莫屬bug。但是測試不只是負責發現問題,除了發現問題這種基本功外,定位問題,提出解決方案,提出預防方案也是要掌握的技能。如何快速定位乙個bug,就需要對功能 產品的流程 開發方案 開發人員非常熟悉。遇到乙個bug的時候,我們要去定位發現這個bug的 是屬於前端還是後...