ACM新成員除錯練習

2021-05-25 08:19:54 字數 3916 閱讀 1232

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=20, 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了。也沒什麼好說的,用乙個迴圈控制輸入的次數就行了 這是本次比賽最難的題目,用意在於賽後你們看見此題題解可以開拓一下思維方式,不要侷限於中學的思維,要掌握計算機。乍...