首頁 後端開發 C#.Net教程 C語言程式設計易犯毛病集合

C語言程式設計易犯毛病集合

Dec 16, 2016 am 09:38 AM
c語言 常見錯誤

C語言中常見錯誤(轉貼) 
C語言的最大特點是:功能強、使用方便靈活。 C編譯的程式對語法檢查並不像其它高級語言那麼嚴格,這就給編程人員留下“靈活的餘地”,但還是由於這個靈活給程序的調試帶來了許多不便,尤其對初學C語言的人來說,常常會出一些連自己都不知道錯在哪裡的錯誤。看著有錯的程序,不知該如何改起,本人透過對C的學習,累積了一些C編程時常犯的錯誤,寫給各位學員以供參考。
1.書寫標識符時,忽略了大小寫字母的差異。
main()
{
int a=5;
PRintf("%d",A);
}
編譯程式把a和A認為是兩個不同的變數名,而顯示出錯訊息。 C認為大寫字母和小寫字母是兩個不同的字元。習慣上,符號常數名用大寫,變數名稱用小寫表示,以增加可讀性。
2.忽略了變數的類型,進行了不合法的運算。
main()
{
float a,b;
printf("%d",a%b);
}
%是求餘運算,得到a/b的整數數。整數變數a和b可以進行求餘運算,而實型變數則不答應進行「求餘」運算。
3.將字元常數與字串常數混淆。
char c;
c="a";
在這裡就混淆了字符常數與字符串常數,字符常數是由一對單引號括起來的單個字符,字符串常數是一對雙引號括起來的字符序列。 C規定以「」作字串結束標誌,它是由系統自動加上的,所以字串「a」其實包含兩個字元:'a'和'',而把它賦給一個字元變數是不行的。
4.忽略了「=」與「==」的區別。
在許多高階語言中,用「=」符號作為關係運算子「等於」。如在BASIC程式中可以寫
if (a=3) then …
但C語言中,「=」是賦值運算符,「==」是關係運算子。如:
if (a==3) a=b;
前者是進行比較,a是否和3相等,後者表示假如a和3相等,把b值賦給a。由於習慣問題,初學者往往會犯這樣的錯誤。
5.忘記加分號。
分號是C語句中不可缺少的一部分,語句末尾必須有分號。
a=1
b=2
編譯時,編譯程式在「a=1」後面沒發現分號,就把下一行「b=2」也當作上一行語句的一部分,這就會出現語法錯誤。改錯時,有時在被指出有錯的一行中未發現錯誤,就需要看一下上一行是否漏掉了分號。
{ z=x+y;
t=z/100;
printf("%f",t);
}
對於複合語句來說,最後一個語句中最後的分號不能忽略不寫(這是和PASCAL不同的)。
6.多加分號。
對於一個複合語句,如:
{ z=x+y;
t=z/100;
printf("%f",t);
};
複合語句的花括號後不應再加分號,否則將會畫蛇添足。
又如:
if (a%3==0);
I++;
本是假如3整除a,則I加1。但由於if (a%3==0)後多加了分號,則if語句到此結束,程式將執行I++語句,不論3是否整除a,I都會自動加1。
再如:
for (I=0;I
本意是先後輸入5個數,每輸入一個數字後再將它輸出。由於for()後多加了一個分號,使迴圈體變成空語句,此時只能輸入一個數並輸出它。
7.輸入變數時忘記加地址運算子「&」。
int a,b;
scanf("%d%d",a,b);
這是不合法的。 Scanf函數的作用是:依照a、b在記憶體的位址將a、b的值存進去。 「&a」指a在記憶體中的位址。
8.輸入資料的方式與要求不符。 ①scanf("%d%d",&a,&b);
輸入時,不能用逗號作兩個資料間的分隔符,如下面輸入不合法:
3,4 
輸入資料時,在兩個資料之間以一個或多個空格間隔,也可用回車鍵,跳格鍵tab。
②scanf("%d,%d",&a,&b);
C規定:假如在「格式控制」字串中除了格式說明以外還有其它字符,則在輸入資料時應輸入與這些字符相同的字元。下面輸入是合法的:
3,4 
此時不用逗號而用空格或其它字符是不對的。
3 4 3:4 
又如:
scanf("a=%d,b=%d",&a,&b);
輸入應如下列形式:
a=3,b=4 
9.輸入字元的格式與要求不一致。
在以「%c」格式輸入字元時,「空格字元」和「轉義字元」都會作為有效字元輸入。
scanf("%c%c%c",&c1,&c2,&c3);
如輸入a b c 
字符“a”送給c1,字符“ ”送給c2,字符“b”送給c3,因為%c只要求讀入一個字符,後面不需要用空格作為兩個字符的間隔。
10.輸入輸出的資料型態與所用格式說明符不一致。
例如,a已定義為整數,b定義為實型
a=3;b=4.5;
printf("%f%d ",a,b);
編譯時不給出出錯訊息,但運行結果將與原意不符。這種錯誤尤其需要注重。
11.輸入資料時,企圖規定精度。
scanf("%7.2f",&a);
這樣做是不合法的,輸入資料時不能規定精確度。
12.switch語句中漏寫break語句。
例如:根據考試成績的等級列印出百分制數段。
switch(grade)
{ case 'A':printf("85~100 ");
case 'B':printf("70~84 ");
case 'C':printf("60~69 ") ;
case 'D':printf("default:printf("error ");
由於漏寫了break語句,case只起標號的作用,而不起判定作用。因此,當grade值為A時,printf函數在執行完第一個語句後接著執行第二、三、四、五個printf函數語句。正確寫法應在每個分支後面再加上「break;」。例如
case 'A':printf("85~100 ");break;
13.忽略了while和do-while語句在細節上的區別。
(1)main()
{int a=0,I;

scanf("%d",&I);
while(I
printf("%d",a);
}
(2)main()
{int a=0,I;
scanf("%d",&I);
do
while(Iprintf("%d",a);
}
可以看到,當輸入I的值小於或等於10時,二者得到的結果相同。而當I>10時,二者結果就不同了。因為while迴圈是先判定後執行,而do-while迴圈是先執行後判定。對於大於10的數while迴圈一次也不執行迴圈體,而do-while語句則要執行一次迴圈體。
14.定義數組時誤用變數。
int n;
scanf("%d",&n);
int a[n];
數組名後用方括號括起來的是常數表達式,可以包括常數和符號常數。即C不答應對數組的大小作動態定義。
15.在定義陣列時,將定義的「元素個數」誤認為是可使的最大下標值。
main()
{static int a[10]=;
printf("%d",a[10]);
}
C語言規定:定義時用a[10],表示a數組有10個元素。其下標值由0開始,所以陣列元素a[10]是不存在的。
16.初始化陣列時,未使用靜態儲存。
int a[3]=;
這樣初始化數組是不對的。 C語言規定只有靜態儲存(static)陣列和外部儲存(exterm)陣列才能初始化。應改為:
static int a[3]=;
17.在不應加地址運算符&的位置加了地址運算符。
scanf("%s",&str);
C語言編譯系統對數組名的處理是:數組名代表該數組的起始位址,且scanf函數中的輸入項是字元數組名,不必要再加地址符&。應改為:
scanf("%s",str);
18.同時定義了形參和函數中的局部變數。
int max(x,y)
int x,y,z;

形參應該在函數體外定義,而局部變數應該在函數體內定義。應改為:
int max(x,y)
int x,y;
{int z;
z=x>y?x:y;
return(z);

以上就是C語言程式設計易用犯毛病集合的內容, 更多相關文章請關注PHP中文網(www.php.cn)!


本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn

熱AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Clothoff.io

Clothoff.io

AI脫衣器

Video Face Swap

Video Face Swap

使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱門文章

<🎜>:泡泡膠模擬器無窮大 - 如何獲取和使用皇家鑰匙
3 週前 By 尊渡假赌尊渡假赌尊渡假赌
北端:融合系統,解釋
3 週前 By 尊渡假赌尊渡假赌尊渡假赌
Mandragora:巫婆樹的耳語 - 如何解鎖抓鉤
3 週前 By 尊渡假赌尊渡假赌尊渡假赌

熱工具

記事本++7.3.1

記事本++7.3.1

好用且免費的程式碼編輯器

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用

禪工作室 13.0.1

禪工作室 13.0.1

強大的PHP整合開發環境

Dreamweaver CS6

Dreamweaver CS6

視覺化網頁開發工具

SublimeText3 Mac版

SublimeText3 Mac版

神級程式碼編輯軟體(SublimeText3)

熱門話題

Java教學
1665
14
CakePHP 教程
1424
52
Laravel 教程
1322
25
PHP教程
1270
29
C# 教程
1250
24
C語言數據結構:樹和圖的數據表示與操作 C語言數據結構:樹和圖的數據表示與操作 Apr 04, 2025 am 11:18 AM

C語言數據結構:樹和圖的數據表示與操作樹是一個層次結構的數據結構由節點組成,每個節點包含一個數據元素和指向其子節點的指針二叉樹是一種特殊類型的樹,其中每個節點最多有兩個子節點數據表示structTreeNode{intdata;structTreeNode*left;structTreeNode*right;};操作創建樹遍歷樹(先序、中序、後序)搜索樹插入節點刪除節點圖是一個集合的數據結構,其中的元素是頂點,它們通過邊連接在一起邊可以是帶權或無權的數據表示鄰

C語言文件操作難題的幕後真相 C語言文件操作難題的幕後真相 Apr 04, 2025 am 11:24 AM

文件操作難題的真相:文件打開失敗:權限不足、路徑錯誤、文件被佔用。數據寫入失敗:緩衝區已滿、文件不可寫、磁盤空間不足。其他常見問題:文件遍歷緩慢、文本文件編碼不正確、二進製文件讀取錯誤。

debian readdir如何與其他工具集成 debian readdir如何與其他工具集成 Apr 13, 2025 am 09:42 AM

Debian系統中的readdir函數是用於讀取目錄內容的系統調用,常用於C語言編程。本文將介紹如何將readdir與其他工具集成,以增強其功能。方法一:C語言程序與管道結合首先,編寫一個C程序調用readdir函數並輸出結果:#include#include#includeintmain(intargc,char*argv[]){DIR*dir;structdirent*entry;if(argc!=2){

CS-第 3 週 CS-第 3 週 Apr 04, 2025 am 06:06 AM

算法是解決問題的指令集,其執行速度和內存佔用各不相同。編程中,許多算法都基於數據搜索和排序。本文將介紹幾種數據檢索和排序算法。線性搜索假設有一個數組[20,500,10,5,100,1,50],需要查找數字50。線性搜索算法會逐個檢查數組中的每個元素,直到找到目標值或遍歷完整個數組。算法流程圖如下:線性搜索的偽代碼如下:檢查每個元素:如果找到目標值:返回true返回falseC語言實現:#include#includeintmain(void){i

c語言如何輸出倒數 c語言如何輸出倒數 Apr 04, 2025 am 08:54 AM

如何在 C 語言中輸出倒數?回答:使用循環語句。步驟:1. 定義變量 n 存儲要輸出的倒數數字;2. 使用 while 循環持續打印 n 直到 n 小於 1;3. 在循環體內,打印出 n 的值;4. 在循環末尾,將 n 減去 1 以輸出下一個更小的倒數。

C語言多線程編程:新手指南與疑難解答 C語言多線程編程:新手指南與疑難解答 Apr 04, 2025 am 10:15 AM

C語言多線程編程指南:創建線程:使用pthread_create()函數,指定線程ID、屬性和線程函數。線程同步:通過互斥鎖、信號量和條件變量防止數據競爭。實戰案例:使用多線程計算斐波那契數,將任務分配給多個線程並同步結果。疑難解答:解決程序崩潰、線程停止響應和性能瓶頸等問題。

c語言函數的定義調用聲明格式怎麼搞 c語言函數的定義調用聲明格式怎麼搞 Apr 04, 2025 am 06:03 AM

C語言函數包含定義、調用和聲明。函數定義指定函數名、參數和返回類型,函數體實現功能;函數調用執行函數並提供參數;函數聲明告知編譯器函數類型。值傳遞用於參數傳遞,注意返回類型,保持一致的代碼風格,並在函數中處理錯誤。掌握這些知識有助於編寫優雅、健壯的C代碼。

c語言函數的概念及其定義格式 c語言函數的概念及其定義格式 Apr 03, 2025 pm 11:33 PM

C语言函数是可重复使用的代码块,接收参数进行处理,返回结果。它类似于瑞士军刀,功能强大,需要谨慎使用。函数包括定义格式、参数、返回值、函数体等元素。高级用法包括函数指针,递归函数和回调函数。常见错误是类型不匹配、忘记声明原型。调试技巧包括打印变量、使用调试器。性能优化使用内联函数。函数设计应遵循单一职责原则。熟练掌握C语言函数可以显著提高编程效率和代码质量。

See all articles