除錯程式的利器 printf

2021-07-11 01:34:47 字數 2106 閱讀 4725

宣告:這些內容主要是面向c語言的初學者,尤其是正在學習c語言的學生。

當排除了所有的語法錯誤,但執行結果卻不正確時,很多初學者往往束手無策,只好求助老師了,「老師,我這個程式沒錯,但結果不正確」,這是在上機課上經常聽到的聲音。初學者缺乏經驗,也缺乏耐心。殊不知每個程式設計師都是在不斷的和錯誤鬥爭的過程中成長起來的,除錯程式的過程有時候是很痛苦的,但發現錯誤原因的那一刻,幸福卻是滿滿的。

除錯程式的方法很多,但對於初學者來說,用好printf基本就能解決大多數問題,可以說簡單實用。當程式編譯報錯時,我們一般能很快解決問題,那是因為編譯器明確地告訴你哪一行有問題。但當編譯沒錯,程式執行結果出錯時,沒有人告訴我們錯在**,這時候就需要自己想辦法去確定錯誤的位置。printf函式就是用來確定錯誤位置的一把利器。執行結果不對時,錯誤可能發生在程式的任意一行,我們可以從列印結果的**開始倒著往回尋找,適當的列印出一些中間結果(變數或者表示式的值),如果發現某個中間結果和你期望的值不同時,就進一步去檢查和分析與這個中間結果相關的語句,有必要的話可以繼續輸出一些變數進行觀察。通過這種不斷列印中間結果進行觀察和分析的方法,往往很快就能定位錯誤的位置。下面通過乙個例子來說明這種方法。

例:計算1-1/2+1/3-1/4+...+1/99-1/100+...,直到最後一項的絕對值小於1e-4為止。

某位學生的程式:

//計算1-1/2+1/3-1/4+...+1/99-1/100+...,直到最後一項的絕對值小於1e-4為止。

#include "stdio.h"

#include "math.h"

int main()

printf("sum = %f\n",sum);

}

程式的執行結果如圖

1所示,sum = 0.000000,顯然這個結果是錯誤的。

圖1. 錯誤的執行結果

分析:

按照我們上面所說的方法,輸出一些中間結果來觀察和分析。離列印sum的語句最近的是while迴圈,迴圈體的最後一句是n++; 我們就先輸出n的值來看看,即在迴圈體的最後加一句printf(「n=%d」,n); 程式如下:

//計算1-1/2+1/3-1/4+...+1/99-1/100+...,直到最後一項的絕對值小於1e-4為止。

#include "stdio.h"

#include "math.h"

int main()

printf("sum = %f\n",sum);

}

你期望的結果一定是一列很長的n= 1 n=2 n=3…,因為我們知道隨著迴圈的不斷進行,n的值一直會增1。然而,重新執行程式後得到的結果居然和圖1一模一樣,乙個n都沒有被輸出,sum依然為0。這和我們的期望相去甚遠,但高興的是,離發現問題很近了。為什麼乙個n都沒有被輸出來呢,n至少還有乙個初值1呀。仔細思考,只有一種可能:while迴圈一次都沒執行。while迴圈一次都不執行的原因也很容易想到,while語句中的迴圈條件第一次就是假。這時候我們就能定位錯誤的位置了:迴圈條件有問題!通過增加乙個printf函式我們就成功定位了錯誤的位置。接下來,就是仔細研究迴圈條件了,題目中說「直到最後一項的絕對值小於1e-4為止」,那意思就是說當某一項的絕對值小於1e-4時,迴圈結束,反過來就是,要讓迴圈得以繼續,每一項的絕對值必須大於等於1e-4。說到這裡,相信大家明白了,源程式中迴圈條件寫反了,正確的應該是:while((1.0/n)>=1e-4)。請自己修改程式並執行。

上面的例子程式比較短,加了乙個printf就能確定錯誤的位置,如果程式較長的話,就需要增加多個printf來列印中間結果,並且逐段去排查。這種方法很靈活,上面的例子中也不一定要列印n的值,也可以列印sum或者term的值來觀察,可以得到同樣的結論,大家需要多做練習來體會這種簡單但強大的除錯程式的方法。

php 除錯程式

在執行時必須知道某個變數為何值。我是這樣做的,建立一檔案debug.php,其內容如下 php php ob start session start echo pre echo 本頁得到的 get變數有 print r get echo 本頁得到的 post變數有 print r post echo...

GDB除錯程式

gdb的三個功能 1 啟動被除錯的程式 2 設定斷點 3 設定斷點之後可以檢查程式的狀態 1.編譯生成可執行檔案 注意 g 除錯選項 gcc g tst.c o tst 2.啟動gdb gdb tst 3.在main函式處設定斷點 break main 4.執行程式 run5.利用 更加豐富的 gd...

gdb除錯程式

除錯是每個程式設計師都會面臨的問題.如何提高程式設計師的除錯效率,更好更快地定位程式中的問題從而加快程式開發的進度,是大家共同面對的問題.可能windows使用者順口就會說出 用vc唄 它提供了設定斷點,單步跟蹤等的圖形介面,使除錯起來直觀易用.但linux使用者可能要生悶氣了 o 難道我們linu...