C 語言標準庫提供了豐富的函數供開發者使用,本文整理了以字母 Q 和 R 開頭的常用函數,涵蓋排序、隨機數生成、檔案操作、記憶體管理、圖形繪製等領域。每個函數均附帶功能說明、語法原型與實戰範例,方便開發者快速查閱與應用。
使用快速排序演算法對陣列進行排序,適用於任意資料型態。
void qsort(void *base, size_t nelem, size_t width, int (*fcmp)(const void *, const void *));
base:待排序陣列的起始位址nelem:陣列元素個數width:單一元素大小(位元組)fcmp:比較函數指標,回傳負值、零、正值分別代表小於、等於、大於#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int sort_function(const void *a, const void *b) {
return strcmp((const char *)a, (const char *)b);
}
int main(void) {
char list[5][4] = {"cat", "car", "cab", "cap", "can"};
int x;
qsort((void *)list, 5, sizeof(list[0]), sort_function);
for (x = 0; x < 5; x++)
printf("%s\n", list[x]);
return 0;
}
輸出結果: cab、can、cap、car、cat(依字典序排列)
向目前執行的程式發送指定訊號,常用於模擬硬體例外或錯誤情境。
int raise(int sig);
#include <signal.h>
int main(void) {
int a = 10, b = 0;
if (b == 0)
raise(SIGFPE); // 主動觸發浮點數例外
a = a / b; // 此行不會被執行
return 0;
}
| 函數 | 功能 | 語法 | 備註 |
|---|---|---|---|
| rand | 產生偽隨機整數 | int rand(void) | 範圍 0 到 RAND_MAX |
| srand | 設定隨機種子 | void srand(unsigned seed) | 通常搭配 time(NULL) 使用 |
| random | 產生指定範圍隨機數 | int random(int num) | 回傳 0 到 num-1,非標準函數 |
| randomize | 自動以時間初始化種子 | void randomize(void) | 非標準函數,等同 srand(time(NULL)) |
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
int main(void) {
int i;
srand((unsigned)time(NULL)); // 以當前時間為種子
printf("Ten random numbers from 0 to 99:\n\n");
for (i = 0; i < 10; i++)
printf("%d\n", rand() % 100);
return 0;
}
這兩個函數用於 DOS 環境下的隨機區塊讀寫操作,屬於較底層的檔案存取方式,現代開發較少直接使用。
int randbrd(struct fcb *fcbptr, int reccnt)int randbwr(struct fcb *fcbptr, int reccnt)範例程式展示了如何透過 FCB(檔案控制區塊)進行隨機存取,包含開啟檔案、設定 DTA(磁碟傳輸區)、讀寫記錄等完整流程。
從開啟的檔案控制代碼讀取資料到緩衝區。
int read(int handle, void *buf, unsigned nbyte);
#include <stdio.h>
#include <fcntl.h>
#include <sys/stat.h>
#include <io.h>
#include <stdlib.h>
#include <malloc.h>
int main(void) {
void *buf = malloc(10);
int handle, bytes;
if ((handle = open("TEST.$$$", O_RDONLY | O_BINARY, S_IWRITE | S_IREAD)) == -1) {
printf("Error Opening File\n");
exit(1);
}
if ((bytes = read(handle, buf, 10)) == -1) {
printf("Read Failed.\n");
exit(1);
} else {
printf("Read: %d bytes read.\n", bytes);
}
return 0;
}
調整已分配記憶體區塊的大小,保留原有資料。
void *realloc(void *ptr, size_t newsize);
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main(void) {
char *str = malloc(10);
strcpy(str, "Hello");
printf("String is %s\n Address is %p\n", str, str);
str = realloc(str, 20); // 擴充至 20 位元組
printf("String is %s\n New address is %p\n", str, str);
free(str);
return 0;
}
注意:realloc 可能會移動記憶體位置,務必使用回傳值更新指標。
在圖形模式下繪製矩形框線。
void far rectangle(int left, int top, int right, int bottom);
#include <graphics.h>
#include <conio.h>
int main(void) {
int gdriver = DETECT, gmode, errorcode;
int left, top, right, bottom;
initgraph(&gdriver, &gmode, "");
errorcode = graphresult();
if (errorcode != grOk) {
printf("Graphics error: %s\n", grapherrormsg(errorcode));
getch();
exit(1);
}
left = getmaxx() / 2 - 50;
top = getmaxy() / 2 - 50;
right = getmaxx() / 2 + 50;
bottom = getmaxy() / 2 + 50;
rectangle(left, top, right, bottom);
getch();
closegraph();
return 0;
}
將連結進程式內部的圖形驅動程式註冊給圖形系統使用。
int registerbgidriver(void (*driver)(void));
常用於靜態連結圖形驅動程式時,避免執行時找不到驅動檔(如 EGAVGA_driver)。
| 函數 | 功能 | 語法 |
|---|---|---|
| remove | 刪除檔案 | int remove(const char *filename) |
| rename | 重新命名檔案 | int rename(const char *oldname, const char *newname) |
| rmdir | 刪除空目錄 | int rmdir(const char *pathname) |
#include <stdio.h>
int main(void) {
char file[80];
printf("File to delete: ");
gets(file);
if (remove(file) == 0)
printf("Removed %s.\n", file);
else
perror("remove");
return 0;
}
將檔案指標重新定位到串流開頭,等同於 fseek(stream, 0L, SEEK_SET)。
void rewind(FILE *stream);
#include <stdio.h>
#include <stdlib.h>
int main(void) {
FILE *fp;
char *fname = "TXXXXXX", *newname, first;
newname = mktemp(fname);
fp = fopen(newname, "w+");
fprintf(fp, "abcdefghijklmnopqrstuvwxyz");
rewind(fp);
fscanf(fp, "%c", &first);
printf("The first character is: %c\n", first);
fclose(fp);
remove(newname);
return 0;
}
將螢幕模式恢復為呼叫 initgraph 之前的文字模式。
void far restorecrtmode(void);
常與 setgraphmode 搭配使用,實現文字與圖形模式切換。
本文彙整了 C 語言中 Q、R 開頭的核心函數,涵蓋排序、隨機數、檔案 I/O、記憶體管理、圖形繪製與目錄操作等實用功能。掌握這些函數能顯著提升系統層級程式開發的效率與靈活度。