本文系統整理以 M 開頭的核心 C 函數,涵蓋程式進入點 main 參數詳解、數學錯誤處理 matherr、記憶體區塊操作 (memcpy 族群)、動態配置 malloc、目錄建立 mkdir、暫存檔命名 mktemp、遠端指標建構 MK_FP、浮點數分解 modf、以及 BGI 圖形座標移動函數 (moveto, moverel 等)。
標準原型:
int main(void);
int main(int argc, char *argv[]);
int main(int argc, char *argv[], char *env[]);
argc:命令列參數個數 (含程式名)。argv[0]:程式完整路徑 (DOS 3.0+),或空字串 (舊版)。argv[1]..argv[argc-1]:使用者輸入參數,雙引號可包含空白。env:環境變數陣列,格式 NAME=VALUE,以 NULL 結尾。範例:列印所有參數與環境變數
#include <stdio.h>
int main(int argc, char *argv[], char *env[]) {
int i;
printf("argc = %d\n", argc);
for (i = 0; i < argc; i++)
printf("argv[%d] = %s\n", i, argv[i]);
for (i = 0; env[i]; i++)
printf("env[%d] = %s\n", i, env[i]);
return 0;
}
執行:EXAMPLE first "with space" 3
輸出:argc=4, argv[0]=EXAMPLE, argv[1]=first, argv[2]=with space, argv[3]=3
功能:當數學函數 (如 sqrt(-1), log(0)) 發生定義域/值域錯誤時被呼叫,回傳非零可抑制預設錯誤訊息與 errno 設定。
#include <math.h>
int matherr(struct exception *e) {
/* 記錄錯誤、修正結果、或直接忽略 */
return 1; // 1 = 不輸出錯誤訊息,0 = 交給預設處理
}
| 函數 | 功能 | 關鍵差異 |
|---|---|---|
memcpy | 複製 n 位元組 | 來源與目的地不可重疊 |
memmove | 移動 n 位元組 | 正確處理重疊區域 |
memccpy | 複製至指定字元為止 | 遇到 ch 停止並回傳下一位址 |
memchr | 搜尋前 n 位元組 | 找到回傳指標,否則 NULL |
memicmp | 比較前 n 位元組 | 忽略大小寫 |
memset | 設定前 n 位元組為指定值 | 常用清零結構體 |
movmem | 同 memmove (Turbo C 別名) | 參數順序 src, dest, len |
範例:安全複製字串含終止符
char src[] = "Hello";
char dest[10];
memcpy(dest, src, strlen(src) + 1); // 複製含 '\0'
void *malloc(size_t size);
void free(void *ptr);
範例:
char *p = malloc(100);
if (!p) { perror("malloc"); exit(1); }
strcpy(p, "Dynamic");
printf("%s\n", p);
free(p);
int mkdir(const char *path);
int rmdir(const char *path);
成功傳回 0,失敗傳回 -1 並設定 errno。
char *mktemp(char *template);
template 需包含 6 個 X (如 TMPXXXXXX),函數會就地修改字串。
void far *MK_FP(unsigned seg, unsigned off);
將段址與位移合併為 32 位元遠端指標,常用於直接存取影像緩衝區 (0xB800) 或硬體暫存器。
double modf(double x, double *intpart);
回傳小數部,*intpart 接收整數部 (同號)。
| 函數 | 功能 | 原型 |
|---|---|---|
moveto | 將當前點 (CP) 移至絕對座標 (x,y) | void far moveto(int x, int y); |
moverel | 將 CP 依相對距離 (dx,dy) 移動 | void far moverel(int dx, int dy); |
movetext | 複製文字模式螢幕矩形區塊 | int movetext(int l, int t, int r, int b, int nl, int nt); |
範例:繪製相對移動軌跡
moveto(20, 30);
putpixel(getx(), gety(), WHITE);
moverel(100, 50);
putpixel(getx(), gety(), WHITE);
void movedata(int src_seg, int src_off, int dst_seg, int dst_off, unsigned n);
可在任意段址間複製資料,例如備份單色螢幕內容:
movedata(0xB000, 0, _DS, (unsigned)buffer, 80*25*2);
normvideo():恢復正常文字亮度 (關閉高亮)。nosound():關閉 PC 蜂鳴器 (配合 sound(freq), delay(ms) 使用)。