scanf 返回成功匹配項數。輸入非預期字符時,該字符殘留於 stdin 緩衝區,導致後續 scanf 重複失敗進入死循環。
int a;
while (scanf("%d", &a) == 0) {
getchar(); // 吞掉非法字符
printf("請輸入整數: ");
}
無優劣之分,以可讀性為準:已知次數用 for,條件驅動用 while。兩者可互換,編譯器生成代碼幾乎相同。
// 計算某月某日是當年第幾天
switch (month - 1) {
case 11: sum += 30;
case 10: sum += 31;
// ... 依此類推
case 1: sum += 31;
}
刻意省略 break 實現累加,代碼緊湊高效。注意:case 標籤後不可直接宣告變數,需加大括號建立作用域。
if (5 == a) // 寫成 5 = a 會編譯報錯 if (strcmp(s1, s2) == 0) // 字串比較必須用 strcmp,不可用 ==
#include <sys.h>:系統目錄(/usr/include 等)#include "my.h":當前目錄 → -I 目錄 → 系統目錄{} 定義作用域,同名變數內層遮蔽外層。LNK1168: cannot open ...exe for writing:程式仍在執行中(未關閉控制台),無法覆蓋輸出檔。關閉程式重新建置即可。char s1[10] = "abc"; // 定長陣列,不可整體賦值 char s2[] = "abc"; // 長度由初始化決定 char *p = "abc"; // 指向字串常量區,不可修改內容
地址是記憶體編號;指標是儲存地址的變數。指標有型別、有大小、可算術運算,地址只是數值。
#define MAX 100:編譯期文字替換,無型別,便於維護魔術數字。malloc 後必須檢查 NULL,失敗直接存取會導致未定義行為極難除錯。free 後指標置 NULL 防止懸空指標二次釋放。