摘要:近年來,C語言不僅為計算機專業工作者使用,而且為廣大計算機應用人員所喜愛和使用。在利用C語言開發應用程序時,由于C語言具有靈活的程序設計風格,語法限制不太嚴格,程序設計自由度大等特點。這就給許多初學C語言的人員造成了許多困難,為了能夠快速找出并改正程序中的錯誤;該文通過對C語言程序設計中常見的錯誤問題進行分析與研究。給出了一些可供參考的實例及解決方法,為學習C語言程序設計的用戶提供方便。
關鍵詞: C語言;常見錯誤;程序調試;實例
中圖分類號:TP312文獻標識碼: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語言是在國內外廣泛流行、使用的一種計算機高級程序設計語言。它的主要特點是:概念簡潔、數據類型豐富、表達能力強,運算符多且使用方便靈活。與其它程序設計語言相比較,具有靈活的編程風格,語法限制不太嚴格,程序設計自由度大(例如:一個語句可以采用多種方式,分多行撰寫;對數組下標越界不做檢查;整型、字符型和邏輯型的數據可以通用等)。這就給程序設計人員留下“靈活的余地”,但是由于這個靈活往往給程序調試,尤其對初學C語言的人來說,經常會出一些連自己都不知道錯在哪里的實例??粗绣e的程序,不知該如何進行修改。通過在C語言的教學與研究過程中,分析了一些關于C語言程序設計時容易犯的錯誤實例,提供給學習C語言的同學及相關人員參考。
1 C語言常見錯誤實例與分析
實例1.Printf語句中“控制字符串”部分分寫在不同的行。
例如:main()
{ printf(“* * * * *”\
Very good!\
* * * * * \);}
該程序的目的是為了顯示這樣的結果: * * * * *
Very good!
* * * * *
但程序運行后卻出現錯誤信息:“Unterminated string or character constant in function main”,對上述錯誤,只要在程序第二行、第三行的最后分別加上“\\” 即可得到正確的結果,也就是說printf語句中的“控制字符串”部分分寫在不同的行時加“\\”連接。
實例2. 忽略了“=”與“==”的區別。
在許多高級語言中,用“=”符號作為關系運算符“等于”。如在BASIC程序中可以寫if (m=10) then …,但C語言中,“=”是賦值運算符,“==”是關系運算符。
例如:if (m==10) m=n;
前者是進行比較,m是否和10相等,后者表示如果m和10相等,把n值賦給m。由于習慣問題,初學者往往很容易犯這樣的錯誤。
實例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);}
程序運行后出現錯信息“Improper use of a typedef symbol in function main”,只要把第六行:FILE *fp;放到第四行前,程序通過。原因是:說明部分要放在其他語句之前。
實例4.將字符常量與字符串常量混淆。
char ch;
ch=\"M\";
在這里就混淆了字符常量與字符串常量,字符常量是由一對單引號括起來的單個字符,而字符串常量是一對雙引號括起來的字符序列。C規定以‘\\0’作字符串結束標志,它是由系統自動加上的,所以字符串“M”實際上包含兩個字符:‘M'和‘\\0',而把它賦給一個字符變量是不正確的。
實例5.輸入變量時忘記加地址運算符“”。
int a,b;
scanf(\"%d%d\",a,b);
這是不合法的。Scanf函數的作用是:按照a、b在內存的地址將a、b的值存進去。“a”指a在內存中的地址?!癰”指b在內存中的地址。
實例6.輸入數據的方式與要求不符。
1) scanf(\"%d%d\",x,y);
輸入時,不能用逗號作兩個數據間的分隔符,如下面輸入不合法:
1,5
輸入數據時,在兩個數據之間以一個或多個空格間隔,也可用回車鍵,跳格鍵tab。
2) scanf(\"%d,%d\",x,y);
C規定:如果在“格式控制”字符串中除了格式說明以外還有其它字符,則在輸入數據時應輸入與這些字符相同的字符。下面輸入是合法的:
1,5
此時不用逗號而用空格或其它字符是不對的。如下面輸入不合法:
1 5 1:5
又如:scanf(\"a=%d,b=%d\",a,b);輸入應如以下形式:
a=1,b=5
實例7.輸入字符的要求與格式不一致。
在用“%c”格式輸入字符時,“轉義字符”和“空格字符”都作為有效字符輸入。
scanf(\"%c%c%c\",c1,c2,c3);
例如:輸入O K !
則字符“O”送給c1,空格字符“ ”送給c2,字符“K”送給c3,因為%c只要求讀入一個字符,后面不需要用空格作為兩個字符的間隔。
實例8. 同時定義了形參與函數中的局部變量。
int max(x,y)
int x,y,z;
形參應該在函數體外定義,而局部變量應該在函數體內定義。應改為:
int max(x,y)
int x,y;
{int z;
z=x>y?x:y;
return(z);}
實例9. 誤用變量定義數組。
int n;
scanf(\"%d\",n);
int a[n];
數組名后用方括號括起來的是常量表達式,可以包括常量和符號常量。即C不允許對數組的大小作動態定義。
實例10. 被調用的函數未在主函數中進行聲明。
例如: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; }
程序運行后出現錯誤信息:“Type mismatch in redeclaration of ‘swap’”,只要在程序的第二句int a,b;前加一句:void swap();程序運行通過。也就是說:被調用函數的定義出現在主調函數之后(除了函數的值是整型或字符型的),要在main()函數中對被調用函數進行說明,void型函數也不例外。
2 結論
通過上面這些實例的分析,可以看出,由于C語言的開放式編程風格,讓C語言初學者,在進行C語言程序設計時往往會出現一些微妙的、不易覺察的錯誤。C語言作為一門完善的編程語言,具有它的科學性與嚴謹性。因此,只有在充分掌握和熟練運用C語言的基本概念、語法規范及結構的基礎上,才能真正享受到C語言靈活自如的編程風格的魅力,這也是學習一切科學知識的基本方法。
參考文獻:
[1] 譚浩強.C程序設計[M].北京:清華大學出版社,2008:37-242.
[2] 楊路明.C語言程序設計[M].北京:京郵電大學出版社,2006:20-150.
[3] 劉明,夏清國.C程序設計.導教-導學-導考[M].西安:西北工業大學出版社,2004:27-215.