王 諾 袁立敏
[摘要]在討論說明C語言程序調試過程的基礎上,根據實踐,結合實例,總結程序調試運行過程中常出現的錯誤,并依據C語言的語法格式和編程規(guī)則,對這些錯誤進行詳細的說明和糾正,以提高學習者的編程效率。
[關鍵詞]C語言調試編譯語法錯誤邏輯錯誤
中圖分類號:TP3文獻標識碼:A文章編號:1671-7597(2009)0710049-01
《C語言程序設計》作為一門計算機技術基礎課程,在國內外得到了廣泛應用。它功能豐富,表達能力強,使用靈活方便,應用面廣,目標程序效率高。但是由于C語言涉及到的概念比較復雜,規(guī)則繁多,使用靈活,不少初學者在學習使用時都感到編輯的程序調試運行時容易出錯。鑒于此,本文在討論說明C語言程序調試過程的基礎上,結合實例總結了程序調試運行過程中常出現的錯誤,以便給學習者以幫助。
一、C語言程序調試過程
所謂程序調試是指檢查程序的錯誤以及改正程序的錯誤。調試程序一般包括以下四個階段:1.編寫程序并查錯;2.在C語言的編譯系統(tǒng)(Turbo C或者VC++6.0)中編輯源程序;3.對程序進行編譯鏈接,并及時發(fā)現程序中存在的錯誤;4.最后改正錯誤。C語言程序的錯誤主要分為兩類:語法錯誤和邏輯錯誤。
二、C語言編程過程中常見錯誤
(一)常見語法錯誤分析
1.書寫主函數時需要注意的問題。
例:
main
{ int i,j,z;
scanf("%d,%d",&i,&j);
z=i+j;printf("%d",z);
}
此程序在編譯時會提示:Declaration syntax error。出現此提示說明在源文件中,可能是某個說明丟失了某些符號或輸入了多余的符號。此程序就是丟失了main函數后面的“( )”。初學者比較容易犯這個錯誤。主函數正確的寫法是main( )。
2.語句后面漏寫分號。
例: main( )
{printf(“癶”?
}
C語言規(guī)定語句末尾必須有分號。分號是C語句不可缺少的一部分。此例中printf(“癶”?語句后面未寫分號,會提示Statement missing ; in function main。我們根據此提示來修改程序。這也是初學者比較容易犯的錯誤。
3.在不該加分號的地方加了分號。
例:
int a=3,b=2;
if(a>b);printf("max=%d ",a);
此程序本意為當a>b時輸出“max=3”的信息。但由于在if(a>b)后加了分號,因此if語句到此結束。即當(a>b)為真時,執(zhí)行一個空語句,本來想a≤b時不輸出上述信息,但現在printf函數語句并不從屬于if語句,而是與if語句平行的語句,所以,無論a是否大于b,都會輸出“max=3”的信息。因此在if、switch、for、while語句中,不要多加分號。
4.在調用庫函數時,沒有寫預編譯命令。
例:
main()
{charc;
printf("Please input one character: ");
c=getchar( );/*輸入1個字符并賦給ch */
putchar(c);
}
調試程序時,出現錯誤提示:Undefined symbol'_getchar' Undefin
ed symbol'_putchar'。因為在使用庫函數時,要用預編譯命令#include將有關的頭文件包括到用戶源文件中。因此,必須在程序的開頭加上預編譯命令:#include “stdio.h”。
(二)常見邏輯錯誤分析
1.輸入輸出的數據的類型與所用格式說明符不一致。
例:
main()
{ int x;float y;
scanf("%f,%d",&x,&y);
printf("%f%d ",x,y);}
此段程序中x定義為整型,y定義為實型。而在輸入輸出x,y時用的格式說明符為%f,%d,這顯然與定義不符。程序運行時并不提示語法錯誤,但是不能得出正確結果。因此,輸入、輸出函數語句分別應改為:scanf("%d,%f",&x,&y); printf("%d%f ",x,y);
2.復合語句忘記加花括弧。
例:
main()
{ int day,x1,x2=1;
for(day=9;day>0;day--)
x1=(x2+1)*2;x2=x1;
printf(“total=%d ”,x1);
}
此程序本意是從第二次循環(huán)開始,直到for循環(huán)結束,這個過程中每次循環(huán)時,x2變量的值是上次循環(huán)所得出的x1的值,但實際執(zhí)行時,x2變量的值并沒有變化,自始至終都是1,這顯然與原意不符。原因就是:for循環(huán)的循環(huán)體語句應該是“x1=(x2+1)*2;x2=x1;”組合而成的復合語句,而不應該只是“x1=(x2+1)*2;”。因此正確的程序是:
main()
{ int day,x1,x2=1;
for(day=9;day>0;day--)
{x1=(x2+1)*2;x2=x1;}
printf(“total=%d ”,x1);
}
3.在使用數組的時候,出現數組下標越界的情況。也就是把定義的“元素個數”誤認為是數組的最大下標值。
例:
main()
{int i, s[6]; printf("input 6 umbers: ");
for(i=0;i<6;i++)scanf("%d",&s[i]);
printf("%d",s[6]);
}
此程序本意是輸出數組s中最后一個元素的值,但是輸出的結果是個不確定的值。因為C語言規(guī)定,定義時,數組名后面的方括號內的數字表示的是數組的元素個數,而數組的下標從0開始,因此數組s的元素為s[0]、s[1]、s[2]、s[3]、s[4]、s[5],所以此程序中的數組元素s[6]是不存在的。
所以要想輸出數組s的最后一個元素,應書寫為:printf(“?”?s[5]);
4.混淆break語句和continue語句的作用。
例:將100~200之間不能被3整除的數輸出。
main()
{int n;
for(n=100;n<=200;n++)
{if (n%3==0)break;
printf(“%d”,n);}}
該程序能夠運行,輸出的結果是:100 101,這顯然不是正確結果。程序運行時當遇到能被3整除的數102時,循環(huán)結束,而本意是結束本次循環(huán)。學習者要牢記break語句是結束整個循環(huán),而continue語句才是結束本次循環(huán)。所以正確的程序是:
main()
{int n;
for(n=100;n<=200;n++)
{if (n%3==0) continue;
printf(“%d”,n);}}
以上我們通過實例,列舉了C語言學習者經常易犯的一些語法錯誤和邏輯錯誤,并根據C語言的語法格式和編程規(guī)則對出現錯誤的原因進行了分析,同時給出糾正后的程序。希望本文對C語言的學習者有所幫助,學習者在編程時應嚴格按照C語言語法規(guī)則編輯調試源程序,在實踐中提高自己編寫程序的能力。
參考文獻:
[1]田淑清,全國計算機等級考試二級教程-C語言程序設計(2008年版),北京:高等教育出版社,2007年8月.
[2]徐新愛,C語言的變量剖析[J].電腦開發(fā)與應用,第20卷第6期.
[3]譚浩強,C語言程序設計[M].第2版,北京:清華大學出版社,2000年.