c語言除錯常見錯誤
一、第一類錯誤分析 1
在使用變數前未定義。
例如:main() {
a=1;
b=2;
printf(″%d
\n″, a+b); }
2語句後面漏寫分號或不該加分號的地方加了分號。
c語言規定,語句必須以分號結束,分號是
c語句不可缺少的一部分,這也是和其它高階語言不同的一點。初學者往往容易忽略這個分號。
如:x=1
y=2;又如在復合語句中漏寫最後乙個語句的分號:
{t=x;
x=y;
y=t }
3不該有空格的地方加了空格
例如,在用/
*...*/對c
程式中的任何部分作注釋時,/與
*之間都不應當有空格。
又如,在關係運算子<=,>
=,==和!=
中,兩個符號之間也不允許有空格。4
定義或引用陣列的方式不對。
c語言規定,在對陣列進行定義或對陣列元素進行引用時必須要用方括號
(對二維陣列或多維陣列的每一維資料都必須分別用方括號括起來
),例如以下寫法都將造成編譯時出錯:
int a(10); int b
[5,4];
printf(″%d
\n″, b
[1+2,2]);
5混淆字元和字串
c語言中的字元常量是由一對單引號括起來的單個字元;而字串常量是用一對雙引號括起來的字串行。字元常量存放在字元型變數中,而字串常量只能存放在字元型陣列中。例如,
假設已說明
num是字元型變數,則以下賦值語句是非法的:
num=″1″; 6
在引用陣列元素或指標變數之前沒對其賦初值。
例如:main()
main() {
int a[6
],b;
{int *ptr, i=1;
b=a[5
];*ptr=i ┇
┇}}以上兩個程式段在編譯時均會出現警告資訊。7
混淆陣列名與指標變數在c
語言中,陣列名代表陣列的首位址,它的值是乙個常量,不能被修改。例如,在以下程式段中,用
a++是不合法的。
main() {
int i, a[10
];for (i=0;i
<10;i++)
scanf(″
%d″, a++); ┇
}8混淆不同型別的指標。
若有以下語句:
int *p1, a=1;
float *p2;
p1=&a;
則賦值語句
p2=p1
是非法的。9
混淆指標說明語句中的
*號和執行語句中的*號。
設有以下說明語句:
int *p1, i=1; 則
*p1=&i;
是不合法的。10
誤將函式形參和函式中的區域性變數一起定義。
例如:fun(x,y)
float x, y, z; {
x++; y++; z=x+y; ┇
}11所呼叫的函式在呼叫前未定義。
main() {
float a=1
0, b=20, c;
c=fun(a,b); ┇
}float fun(x, y)
float x, y; {
x++; y++; ┇
}12混淆結構體型別名和結構體變數名。
若定義了以下結構體型別
student
:struct student {
long int num;
char name[20
];int age;
float score; }
; 則賦值語句:
student.num=199401;
是錯誤的。
第二類錯誤分析 1
在用scanf
函式給普通變數輸入資料時,在變數名前漏寫位址運算子&。
如:scanf(″%d
%d″, x, y); 2
在scanf
函式呼叫語句中,企圖規定輸入實型資料的小數字。
如執行以下語句
:scanf(″
%6.2f″, &a);3
輸入資料時的資料形式與要求不符。
用scanf
函式輸入資料時,必須注意要與
scanf
語句中的對應形式匹配。如:
scanf(″%d,
%d″,&x, &y);
若按以下形式輸入資料:
2 4是不合法。資料2和
4之間應當有逗號。4
輸入、輸出時的資料型別與所用格式說明符不匹配。
例如有以下說明語句:
int x=1; float y=2.5;
則執行時執行語句
printf(″x=
%f, y=%d
\n″, x, y);
將給出與原意不符的結果:(在
turbo c 2.0
下執行)5
混淆"="
和"=="。在
c語言中,
"="賦值運算子,
"=="
是關係運算子。6
在不該出現分號的地方加了分號。
例如:if(x>y)
;printf(″x is larger than y.
\n″);7
對於復合語句,忘記加花括號。
例如:i=1; a=0;
while (i
<=10)
a+=i; i++;
printf(″a=%d
\n″,a);8
誤把陣列說明時所定義的元素個數作為最大下標值使用。
c語言規定,引用陣列元素時下標從
0開始,即下標值的下限為
0,而下標的上限值是陣列定義時元素個數減1。
9在switch
語句的各分支中未使用
break
語句。例如:
switch(grade)
{case′a′: printf(″85 100
\n″);
case′b′: printf(″70 84
\n″);
case′c′: printf(″60 69
\n″);
case′d′: printf(″<60
\n″);
default:
printf(″error
\n″);}10
混淆break
語句和continue
語句的作用。
例如:do
{scanf(″
%d″,&x);
if(x
>0) break;
printf(″%d
\n″,x);
}while(x! =0);11
使用++或--
運算子時易犯的錯誤。
如:main()
{int a[5
]=,*p;
p=a;
printf(″%d
\n″,*(p++));┇}
12誤解形參值的變化會影響實參的值。
例如:main()
{int a=1, b=3;
swap(a, b);
printf(″a=
%d, b=%d
\n″,a,b);
}swap(x,y)
int x,y;
{int m;
m=x; x=y; y=m;
}原意想通過呼叫
swap
函式使a與b
的值對換,然而,從輸出結果可知a和
b的值並未進行交換。
ACM團隊招新賽題解
標程 全部為c語言編寫。中的 if local 至 endif 為本地一些除錯內容,可以忽略。簽到題,做不出的話可能你有點不太適合acm了。也沒什麼好說的,用乙個迴圈控制輸入的次數就行了 這是本次比賽最難的題目,用意在於賽後你們看見此題題解可以開拓一下思維方式,不要侷限於中學的思維,要掌握計算機。乍...
ACM團隊招新賽題解
標程 全部為c語言編寫。中的 if local 至 endif 為本地一些除錯內容,可以忽略。簽到題,做不出的話可能你有點不太適合acm了。也沒什麼好說的,用乙個迴圈控制輸入的次數就行了 這是本次比賽最難的題目,用意在於賽後你們看見此題題解可以開拓一下思維方式,不要侷限於中學的思維,要掌握計算機。乍...
ACM團隊招新賽題解
標程 全部為c語言編寫。中的 if local 至 endif 為本地一些除錯內容,可以忽略。簽到題,做不出的話可能你有點不太適合acm了。也沒什麼好說的,用乙個迴圈控制輸入的次數就行了 這是本次比賽最難的題目,用意在於賽後你們看見此題題解可以開拓一下思維方式,不要侷限於中學的思維,要掌握計算機。乍...