摘要:近年來,C語言不僅為計算機專業(yè)工作者使用,而且為廣大計算機應(yīng)用人員所喜愛和使用。在利用C語言開發(fā)應(yīng)用程序時,由于C語言具有靈活的程序設(shè)計風(fēng)格,語法限制不太嚴格,程序設(shè)計自由度大等特點。這就給許多初學(xué)C語言的人員造成了許多困難,為了能夠快速找出并改正程序中的錯誤;該文通過對C語言程序設(shè)計中常見的錯誤問題進行分析與研究。給出了一些可供參考的實例及解決方法,為學(xué)習(xí)C語言程序設(shè)計的用戶提供方便。
關(guān)鍵詞: C語言;常見錯誤;程序調(diào)試;實例
中圖分類號:TP312文獻標(biāo)識碼:A文章編號:1009-3044(2009)35-9969-02
Analysis of Common Error Based on C Programming Language
GAO Ya-xia1, ZOU Hai-rong2
(1.Shaanxi Commercial School, Hanzhong 723000, China; 2.Shaanxi Institute Of Technology, Hanzhong 723000, China)
Abstract: In recent years, not only the computer professionals use C language, but also the majority of staff computer applications favorite and use. In the use of C language application development, due to C language has a flexible programming style, grammar constraints are less stringent and program design large degree of freedom and so on. This C language to a number of beginner and causing a number of difficulties, in order to be able to quickly identify and correct errors in the program; this paper, the C language program design issues common mistakes analysis and research. Gives some examples and reference solutions, in order to learn C language program designed users to provide with convenient.
Key words: C Language; common errors; debugging program; example
C語言是在國內(nèi)外廣泛流行、使用的一種計算機高級程序設(shè)計語言。它的主要特點是:概念簡潔、數(shù)據(jù)類型豐富、表達能力強,運算符多且使用方便靈活。與其它程序設(shè)計語言相比較,具有靈活的編程風(fēng)格,語法限制不太嚴格,程序設(shè)計自由度大(例如:一個語句可以采用多種方式,分多行撰寫;對數(shù)組下標(biāo)越界不做檢查;整型、字符型和邏輯型的數(shù)據(jù)可以通用等)。這就給程序設(shè)計人員留下“靈活的余地”,但是由于這個靈活往往給程序調(diào)試,尤其對初學(xué)C語言的人來說,經(jīng)常會出一些連自己都不知道錯在哪里的實例??粗绣e的程序,不知該如何進行修改。通過在C語言的教學(xué)與研究過程中,分析了一些關(guān)于C語言程序設(shè)計時容易犯的錯誤實例,提供給學(xué)習(xí)C語言的同學(xué)及相關(guān)人員參考。
1 C語言常見錯誤實例與分析
實例1.Printf語句中“控制字符串”部分分寫在不同的行。
例如:main()
{ printf(“* * * * *”\
Very good!\
* * * * * \);}
該程序的目的是為了顯示這樣的結(jié)果: * * * * *
Very good!
* * * * *
但程序運行后卻出現(xiàn)錯誤信息:“Unterminated string or character constant in function main”,對上述錯誤,只要在程序第二行、第三行的最后分別加上“\\” 即可得到正確的結(jié)果,也就是說printf語句中的“控制字符串”部分分寫在不同的行時加“\\”連接。
實例2. 忽略了“=”與“==”的區(qū)別。
在許多高級語言中,用“=”符號作為關(guān)系運算符“等于”。如在BASIC程序中可以寫if (m=10) then …,但C語言中,“=”是賦值運算符,“==”是關(guān)系運算符。
例如:if (m==10) m=n;
前者是進行比較,m是否和10相等,后者表示如果m和10相等,把n值賦給m。由于習(xí)慣問題,初學(xué)者往往很容易犯這樣的錯誤。
實例3.定義變量的位置不正確。
例如:#include
main()
{ char ch,filename[10];
scanf(“%s”,filename);
FILE *fp;
fp=fopen(filename,“w”);
ch=getchar();
while(ch!=‘#’)
{ fputc(ch,fp);putchar(ch);ch=getchar();}
fclose(fp);}
程序運行后出現(xiàn)錯信息“Improper use of a typedef symbol in function main”,只要把第六行:FILE *fp;放到第四行前,程序通過。原因是:說明部分要放在其他語句之前。
實例4.將字符常量與字符串常量混淆。
char ch;
ch=\"M\";
在這里就混淆了字符常量與字符串常量,字符常量是由一對單引號括起來的單個字符,而字符串常量是一對雙引號括起來的字符序列。C規(guī)定以‘\\0’作字符串結(jié)束標(biāo)志,它是由系統(tǒng)自動加上的,所以字符串“M”實際上包含兩個字符:‘M'和‘\\0',而把它賦給一個字符變量是不正確的。
實例5.輸入變量時忘記加地址運算符“”。
int a,b;
scanf(\"%d%d\",a,b);
這是不合法的。Scanf函數(shù)的作用是:按照a、b在內(nèi)存的地址將a、b的值存進去?!癮”指a在內(nèi)存中的地址?!癰”指b在內(nèi)存中的地址。
實例6.輸入數(shù)據(jù)的方式與要求不符。
1) scanf(\"%d%d\",x,y);
輸入時,不能用逗號作兩個數(shù)據(jù)間的分隔符,如下面輸入不合法:
1,5
輸入數(shù)據(jù)時,在兩個數(shù)據(jù)之間以一個或多個空格間隔,也可用回車鍵,跳格鍵tab。
2) scanf(\"%d,%d\",x,y);
C規(guī)定:如果在“格式控制”字符串中除了格式說明以外還有其它字符,則在輸入數(shù)據(jù)時應(yīng)輸入與這些字符相同的字符。下面輸入是合法的:
1,5
此時不用逗號而用空格或其它字符是不對的。如下面輸入不合法:
1 5 1:5
又如:scanf(\"a=%d,b=%d\",a,b);輸入應(yīng)如以下形式:
a=1,b=5
實例7.輸入字符的要求與格式不一致。
在用“%c”格式輸入字符時,“轉(zhuǎn)義字符”和“空格字符”都作為有效字符輸入。
scanf(\"%c%c%c\",c1,c2,c3);
例如:輸入O K !
則字符“O”送給c1,空格字符“ ”送給c2,字符“K”送給c3,因為%c只要求讀入一個字符,后面不需要用空格作為兩個字符的間隔。
實例8. 同時定義了形參與函數(shù)中的局部變量。
int max(x,y)
int x,y,z;
形參應(yīng)該在函數(shù)體外定義,而局部變量應(yīng)該在函數(shù)體內(nèi)定義。應(yīng)改為:
int max(x,y)
int x,y;
{int z;
z=x>y?x:y;
return(z);}
實例9. 誤用變量定義數(shù)組。
int n;
scanf(\"%d\",n);
int a[n];
數(shù)組名后用方括號括起來的是常量表達式,可以包括常量和符號常量。即C不允許對數(shù)組的大小作動態(tài)定義。
實例10. 被調(diào)用的函數(shù)未在主函數(shù)中進行聲明。
例如:main()
{ int a,b,*p1,*p2;
Scanf(“%d,%d”,a,b);
p1=a;p2=b;
if(a
printf(“5d,%d\”,*p1,*p2); }
void swap(int *p1,int *p2)
{ int *p;
P=*p1;*p1=*p2;*p2=p; }
程序運行后出現(xiàn)錯誤信息:“Type mismatch in redeclaration of ‘swap’”,只要在程序的第二句int a,b;前加一句:void swap();程序運行通過。也就是說:被調(diào)用函數(shù)的定義出現(xiàn)在主調(diào)函數(shù)之后(除了函數(shù)的值是整型或字符型的),要在main()函數(shù)中對被調(diào)用函數(shù)進行說明,void型函數(shù)也不例外。
2 結(jié)論
通過上面這些實例的分析,可以看出,由于C語言的開放式編程風(fēng)格,讓C語言初學(xué)者,在進行C語言程序設(shè)計時往往會出現(xiàn)一些微妙的、不易覺察的錯誤。C語言作為一門完善的編程語言,具有它的科學(xué)性與嚴謹性。因此,只有在充分掌握和熟練運用C語言的基本概念、語法規(guī)范及結(jié)構(gòu)的基礎(chǔ)上,才能真正享受到C語言靈活自如的編程風(fēng)格的魅力,這也是學(xué)習(xí)一切科學(xué)知識的基本方法。
參考文獻:
[1] 譚浩強.C程序設(shè)計[M].北京:清華大學(xué)出版社,2008:37-242.
[2] 楊路明.C語言程序設(shè)計[M].北京:京郵電大學(xué)出版社,2006:20-150.
[3] 劉明,夏清國.C程序設(shè)計.導(dǎo)教-導(dǎo)學(xué)-導(dǎo)考[M].西安:西北工業(yè)大學(xué)出版社,2004:27-215.