c語言深入學習階段,我正在讀《c語言程式設計之道》這本書,整理了c語言中的一些技術陷阱。這本書上的封面上有一句話我覺得挺有道理——「每多學一點知識,就少寫一行**」,知識便是財富。一、c語言中的識別符號是區分大小寫的
這是很基本的問題,初學者也很容易忽視。
二、」{}」與」」的混淆使用
例如:
int main()
;}
本想定義二維陣列並初始化依次賦值為1,2,3,4,5,6。然而事實上的賦值結果為3,6,0,0,0,0, 原因是()的使用,()運算子等級最高,優先計算裡面的式子,特別注意的是逗號也是運算子,運算結果為最後乙個表示式的值,即分別為3和6,其他則沒有賦值,預設值為0。
所以應該改為:int a[2][3] = , };
三、使用迴圈語句不當,產生死迴圈
例:
unsigned int a;
for(a = 10; a >= 0; a--)
這個程式編譯執行的話便會產生死迴圈,不斷列印數值。原因是變數a的定義問題,a被定義為無符號變數,必然滿足a>=0。應該將unsigned去掉,定義a為有符號變數。
四、do…while 和 while的區分
do…while先執行再判斷,while先判斷再執行。
五、資料溢位
為了防止溢位,定義變數時可以選擇範圍更廣的資料型別,比如int型換成long型,但同時也會降低運算速度,儘量減少使用。
六、輸入資料忘記新增取位址符&
例:
int a;
scanf("%d", a);
scanf輸入資料應該使用位址,即應該改為&a。
七、scanf輸入格式不符
格式控制中沒新增任何符號則可以使用空格、enter鍵、或tab鍵進行間隔。
注意:
1、使用錯誤的格式輸入資料,不會產生錯誤提示,但沒有輸入正確的資料。
2、「格式控制」中使用的英文或中文的逗號要區分。
八、輸入資料的型別不符
scanf中%c格式連續輸入字元,且格式控制中沒加任何符號時,執行時不能使用空格作為間隔符。因為空格本身會被當做字元輸入。
九、switch語句中break的使用不能忘記。
十、指標沒有被初始化
指標需要指向某個位址,才具有實際的意義,如變數的位址、陣列的首位址等。
宣告指標時,若不立即初始化,最好先初始化指向null,防止誤指,產生不必要的錯誤。
十一、超出動態分配的記憶體
malloc函式在記憶體動態儲存區分配指定長度的連續空間,返回void型的起始位址。
十二、使用記憶體後未釋放
malloc函式使用後要用free函式釋放空間。
十三、記憶體釋放後就不能再被使用
例:
char *str = malloc(20);
strcpy(str, "goodluck");
free(str);
printf("%s\n", str);
執行會出錯,應當將釋放操作放到最後,最好再加上str = null。
十四、沒有宣告所使用的函式的標頭檔案
十五、忽略字串結束符
例:
char *or_str = "hello world!";
char *cp_str = malloc(strlen(or_str));
strcpy(cp_str, or_str);
strlen函式計算的長度不包含結束符』\0』,但strcpy函式複製時系統會自動給字串加結束符。所以分配的長度應該加一,即char *cp_str = malloc(strlen(or_str) + 1);
十六、定義陣列長度使用變數
定義陣列的長度應該使用常量。
C 語言中 struct 的陷阱
假設我們要為某大學寫乙個工資管理程式。首先是表示員工的 employee 類 employee.cs 01 namespace skyiv.ben 02 06 public string name 07 public decimal salary 08 09 public employee stri...
C 語言中 struct 的陷阱
假設我們要為某大學寫乙個工資管理程式。首先是表示員工的 employee 類 employee.cs 01 namespace skyiv.ben 02 06 public string name 07 public decimal salary 08 09 public employee stri...
C語言中strlen方法的陷阱
在用strlen時遇到挺鬱悶的問題,用strlen求字元陣列的長度時總是不對,google了一下才發現忽略了其中的一些細節。int main 在我的機器上執行結果總是26,但明顯應該是5,why?看了下strlen的原始碼才明白,strlen判斷字串長度時是以 0 為界的,也即strlen碰到 0 ...