單步調(diào)試是指程序開發(fā)中,為了找到程序的bug,通常采用的一種調(diào)試手段,一步一步跟蹤程序執(zhí)行的流程,根據(jù)變量的值,找到錯(cuò)誤的原因。
三原網(wǎng)站制作公司哪家好,找成都創(chuàng)新互聯(lián)公司!從網(wǎng)頁(yè)設(shè)計(jì)、網(wǎng)站建設(shè)、微信開發(fā)、APP開發(fā)、響應(yīng)式網(wǎng)站等網(wǎng)站項(xiàng)目制作,到程序開發(fā),運(yùn)營(yíng)維護(hù)。成都創(chuàng)新互聯(lián)公司公司2013年成立到現(xiàn)在10年的時(shí)間,我們擁有了豐富的建站經(jīng)驗(yàn)和運(yùn)維經(jīng)驗(yàn),來(lái)保證我們的工作的順利進(jìn)行。專注于網(wǎng)站建設(shè)就選成都創(chuàng)新互聯(lián)公司。
解決這個(gè)問(wèn)題的方法如下:
1、首先需要設(shè)置斷點(diǎn)的那一行代碼的最前面點(diǎn)擊下,就會(huì)出現(xiàn)一個(gè)紅色的圓球,代表設(shè)置斷點(diǎn)成功,下圖一共設(shè)置了4個(gè)斷點(diǎn)。
2、設(shè)置斷點(diǎn)完成之后,按下F5,開始斷點(diǎn)調(diào)試,斷點(diǎn)走到的位置,會(huì)在紅色圓球上添加一個(gè)黃色箭頭。
3、繼續(xù)按下F5, 程序會(huì)往下執(zhí)行,走到下一個(gè)斷點(diǎn)的時(shí)候停止。
4、繼續(xù)按下F5,當(dāng)設(shè)置的斷點(diǎn)不滿足條件的時(shí)候,不會(huì)走進(jìn)去,而是繼續(xù)執(zhí)行,跳到下一個(gè)斷點(diǎn)。
5、另外,當(dāng)走到某個(gè)斷點(diǎn)處,可以實(shí)時(shí)更改當(dāng)前變量的值。
6、當(dāng)不需要單步調(diào)試的時(shí)候,點(diǎn)擊下圖標(biāo)示的圖標(biāo),可以刪除所有的斷點(diǎn)。
7、刪掉之后,紅色圓點(diǎn)消失,這樣問(wèn)題就解決了。
單步調(diào)試過(guò)程中,如果要跳出本次循環(huán),只能在循環(huán)外語(yǔ)句設(shè)置一個(gè)斷點(diǎn),然后執(zhí)行運(yùn)行命令,這樣調(diào)試工具就會(huì)開始運(yùn)行程序,直到遇到斷點(diǎn)后暫停,從而達(dá)到跳出循環(huán)的效果。
具體如何設(shè)置斷點(diǎn),與編譯器及調(diào)試工具相關(guān),不做列舉,可以查閱調(diào)試工具的幫助文檔。
這種方法需要注意以下兩點(diǎn):
1 如果在循環(huán)中,存在指向循環(huán)外的goto語(yǔ)句,return語(yǔ)句,以及exit()調(diào)用等,這類語(yǔ)句屬于循環(huán)非正常退出點(diǎn),調(diào)試時(shí)需要同時(shí)在對(duì)應(yīng)語(yǔ)句位置下斷點(diǎn)。
2 如果循環(huán)可能為死循環(huán),那么就會(huì)永遠(yuǎn)無(wú)法跳出循環(huán),如果在運(yùn)行后長(zhǎng)期無(wú)法執(zhí)行到斷點(diǎn),就需要檢查是否為這種情況了。
函數(shù)都是并列關(guān)系,不存在一個(gè)嵌套另一個(gè)的問(wèn)題,只能是一個(gè)調(diào)用另一個(gè),在其中又調(diào)用另一個(gè),一層層調(diào)用,正常情況都只有一個(gè)返回出口,也是一層一層返回,不能跳過(guò)。
程序中途跳出,和結(jié)束是兩個(gè)不同的概念。
1 要使程序中途跳出,可以使用return語(yǔ)句,跳出該函數(shù)。
如
int?fun(int?n)
{
int?i;
if(n0)?return?-1;//?在n為負(fù)數(shù)下,提前退出該函數(shù)。?
//執(zhí)行正常功能。?
for(i=0;in;i++)
printf("%d?",?i);
}
2 要使程序提前結(jié)束, 可以調(diào)用exit()函數(shù)。?
如
int?fun(int?n)
{
int?i;
if(n0)?exit(-1);//?在n為負(fù)數(shù)下,提前結(jié)束程序。?
//執(zhí)行正常功能。?
for(i=0;in;i++)
printf("%d?",?i);
}
3 二者區(qū)別:
a) 使用exit函數(shù),會(huì)結(jié)束整個(gè)程序。 而使用return只是結(jié)束當(dāng)前函數(shù),還會(huì)到主調(diào)函數(shù)處繼續(xù)運(yùn)行。
b) 在main函數(shù)中使用return語(yǔ)句,等效于調(diào)用exit函數(shù),同樣會(huì)結(jié)束程序。
c) 調(diào)用exit函數(shù)時(shí),需要引用頭文件stdlib.h。
可以使用fseek函數(shù),直接偏移指針的指向位置到第二行。
函數(shù)原型
int fseek(FILE *stream, long offset, int fromwhere);函數(shù)設(shè)置文件指針stream的位置。如果執(zhí)行成功,stream將指向以fromwhere為基準(zhǔn),偏移offset(指針偏移量)個(gè)字節(jié)的位置,函數(shù)返回0。如果執(zhí)行失敗(比如offset超過(guò)文件自身大小),則不改變stream指向的位置,函數(shù)返回一個(gè)非0值。
可以使用fgets函數(shù),遇到需要跳過(guò)的行時(shí),直接讀取該行并棄舍該行字符值。
函數(shù)原型
char *fgets(char *buf, int bufsize, FILE *stream);
參數(shù)
*buf: 字符型指針,指向用來(lái)存儲(chǔ)所得數(shù)據(jù)的地址。
bufsize: 整型數(shù)據(jù),指明存儲(chǔ)數(shù)據(jù)的大小。
*stream: 文件結(jié)構(gòu)體指針,將要讀取的文件流。
應(yīng)該是已經(jīng)走了。
但是你Keyscan后就調(diào)用另外兩個(gè)函數(shù)。而兩個(gè)函數(shù)也沒(méi)有個(gè)執(zhí)行的顯示,所以看上去就象是一直在執(zhí)行keyscan函數(shù)一樣。
而且你的while(1)這個(gè)執(zhí)行條件,一直就是真。所以,你這個(gè)程序,首先是無(wú)法跳出循環(huán)。
第二,循環(huán)肯定是已經(jīng)執(zhí)行了另外兩個(gè)方法,但是因?yàn)槟愕膬蓚€(gè)函數(shù)沒(méi)有輸出提示,所以你誤以為沒(méi)有執(zhí)行。
建立你在兩個(gè)函數(shù)里用兩個(gè)輸出語(yǔ)句,你就可以看到,你的這兩個(gè)函數(shù)實(shí)際已經(jīng)執(zhí)行了。