本文整理以 U 開頭的實用 C 函數,涵蓋無號長整數轉字串、字元推回輸入串流/鍵盤緩衝區、Unix 時間轉 DOS 格式、檔案刪除與檔案鎖定解除等功能,附標準原型與實戰範例。
char *ultoa(unsigned long value, char *str, int radix);
參數:value 待轉數值,str 目的緩衝區 (需足夠大),radix 基數 (2, 8, 10, 16…)。回傳 str。
unsigned long n = 3123456789UL;
char buf[32];
ultoa(n, buf, 16); // buf = "BA5EBA15"
int ungetc(int c, FILE *stream);
用途:解析器「前瞻一字元」後發現不屬於當前 token,需歸還給串流。每次呼叫保證至少可推回一字元;EOF 不可推回。
/* 讀取整數,遇非數字字元推回 */
int i = 0, ch;
while ((ch = getchar()) != EOF && isdigit(ch))
i = i * 10 + (ch - '0');
if (ch != EOF) ungetc(ch, stdin); // 歸還非數字字元
printf("%d\n", i);
int ungetch(int c);
差異:作用於 conio.h 的鍵盤緩衝區,搭配 getche()/getch() 使用。同樣至少保證一字元推回深度。
int i = 0, ch;
while ((ch = getche()) != EOF && isdigit(ch))
i = i * 10 + (ch - '0');
if (ch != EOF) ungetch(ch);
printf("\n%d\n", i);
void unixtodos(long utime, struct date *d, struct time *t);
utime 為自 1970-01-01 00:00:00 UTC 起的秒數。配合 dostounix 可雙向轉換,利於日期運算 (如加減天數)。
long u = dostounix(&dt, &tm); // 取得當前 Unix 時間
u -= 86400L * 42; // 減去 42 天
unixtodos(u, &dt, &tm); // 轉回 DOS 結構
int unlink(const char *filename);
成功傳回 0,失敗傳回 -1 並設 errno。若檔案被開啟,行為視作業系統而定 (DOS 通常允許刪除開啟檔,Windows 則拒絕)。
FILE *fp = fopen("temp.tmp", "w");
fclose(fp);
unlink("temp.tmp");
int unlock(int handle, long offset, long length);
釋放先前以 lock(handle, offset, length) 鎖定的檔案區域,允許其他程序存取。參數必須與 lock 完全一致。
int h = sopen("data.dat", O_RDWR, SH_DENYNO, S_IREAD|S_IWRITE);
lock(h, 0, 100); // 鎖定前 100 位元組
/* 獨佔存取 */
unlock(h, 0, 100); // 釋放
close(h);
適用平台:上述函數多為 MS-DOS / Borland C / Microsoft C 經典擴充,現代跨平台建議使用 POSIX unlink, fcntl (鎖定)、strtoull (字串轉換) 等標準介面。