首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> C >> C 語言入門

C 語言實戰經驗談:從 scanf 陷阱到記憶體管理的常見錯誤與最佳實踐

     編輯:C 語言入門

1. scanf 返回值與緩衝區陷阱

scanf 返回成功匹配項數。輸入非預期字符時,該字符殘留於 stdin 緩衝區,導致後續 scanf 重複失敗進入死循環。

int a;
while (scanf("%d", &a) == 0) {
    getchar();  // 吞掉非法字符
    printf("請輸入整數: ");
}

2. 迴圈選擇:while vs for

無優劣之分,以可讀性為準:已知次數用 for,條件驅動用 while。兩者可互換,編譯器生成代碼幾乎相同。

3. switch 進階技巧:利用貫穿特性累加

// 計算某月某日是當年第幾天
switch (month - 1) {
    case 11: sum += 30;
    case 10: sum += 31;
    // ... 依此類推
    case 1:  sum += 31;
}

刻意省略 break 實現累加,代碼緊湊高效。注意:case 標籤後不可直接宣告變數,需加大括號建立作用域。

4. if 比較防誤寫:常數左置

if (5 == a)  // 寫成 5 = a 會編譯報錯
if (strcmp(s1, s2) == 0)  // 字串比較必須用 strcmp,不可用 ==

5. 頭文件包含路徑規則

  • #include <sys.h>:系統目錄(/usr/include 等)
  • #include "my.h":當前目錄 → -I 目錄 → 系統目錄
  • 自訂頭文件建議用雙引號,標準庫用尖括號。

6. 變數作用域與生命週期

  • 區塊 {} 定義作用域,同名變數內層遮蔽外層。
  • 迴圈/判斷單句不加大括號時,該句即為作用域。
  • 作用域結束時區域變數銷毀,記憶體釋放,下次進入重新分配,不構成重複定義。

7. 常見建置錯誤排查

  • LNK1168: cannot open ...exe for writing:程式仍在執行中(未關閉控制台),無法覆蓋輸出檔。關閉程式重新建置即可。
  • C89 標準要求變數宣告必須在區塊開頭,C99/C++ 允許混合宣告。VS 編譯 .c 檔預設 C89,需改 .cpp 或升級編譯器標準。

8. 字串、陣列、指標三角關係

char s1[10] = "abc";   // 定長陣列,不可整體賦值
char s2[] = "abc";     // 長度由初始化決定
char *p = "abc";       // 指向字串常量區,不可修改內容
  • 陣列名退化為首元素地址(右值),不可修改指向。
  • 指標可重新指向,但需管理指向記憶體的生命週期(malloc/free)。

9. 指標 vs 地址

地址是記憶體編號;指標是儲存地址的變數。指標有型別、有大小、可算術運算,地址只是數值。

10. 宏與動態記憶體

  • #define MAX 100:編譯期文字替換,無型別,便於維護魔術數字。
  • malloc 後必須檢查 NULL,失敗直接存取會導致未定義行為極難除錯。
  • free 後指標置 NULL 防止懸空指標二次釋放。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved