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

C 語言標準庫函數速查:以 Q、R 開頭的函數完整指南

     編輯:關於C語言

前言

C 語言標準庫提供了豐富的函數供開發者使用,本文整理了以字母 Q 和 R 開頭的常用函數,涵蓋排序、隨機數生成、檔案操作、記憶體管理、圖形繪製等領域。每個函數均附帶功能說明、語法原型與實戰範例,方便開發者快速查閱與應用。

快速排序:qsort

功能

使用快速排序演算法對陣列進行排序,適用於任意資料型態。

語法

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(依字典序排列)

發送訊號:raise

功能

向目前執行的程式發送指定訊號,常用於模擬硬體例外或錯誤情境。

語法

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 / random / randomize / srand

函數功能語法備註
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))

範例:產生 10 個 0~99 隨機數

#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;
}

隨機區塊讀寫:randbrd / randbwr

這兩個函數用於 DOS 環境下的隨機區塊讀寫操作,屬於較底層的檔案存取方式,現代開發較少直接使用。

  • randbrd:隨機區塊讀取,語法 int randbrd(struct fcb *fcbptr, int reccnt)
  • randbwr:隨機區塊寫入,語法 int randbwr(struct fcb *fcbptr, int reccnt)

範例程式展示了如何透過 FCB(檔案控制區塊)進行隨機存取,包含開啟檔案、設定 DTA(磁碟傳輸區)、讀寫記錄等完整流程。

檔案讀取:read

功能

從開啟的檔案控制代碼讀取資料到緩衝區。

語法

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;
}

記憶體重新分配:realloc

功能

調整已分配記憶體區塊的大小,保留原有資料。

語法

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 可能會移動記憶體位置,務必使用回傳值更新指標。

圖形繪製:rectangle

功能

在圖形模式下繪製矩形框線。

語法

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;
}

圖形驅動程式註冊:registerbgidriver

功能

將連結進程式內部的圖形驅動程式註冊給圖形系統使用。

語法

int registerbgidriver(void (*driver)(void));

常用於靜態連結圖形驅動程式時,避免執行時找不到驅動檔(如 EGAVGA_driver)。

檔案與目錄操作:remove / rename / rmdir

函數功能語法
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;
}

檔案指標操作:rewind

功能

將檔案指標重新定位到串流開頭,等同於 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;
}

圖形模式恢復:restorecrtmode

功能

將螢幕模式恢復為呼叫 initgraph 之前的文字模式。

語法

void far restorecrtmode(void);

常與 setgraphmode 搭配使用,實現文字與圖形模式切換。


本文彙整了 C 語言中 Q、R 開頭的核心函數,涵蓋排序、隨機數、檔案 I/O、記憶體管理、圖形繪製與目錄操作等實用功能。掌握這些函數能顯著提升系統層級程式開發的效率與靈活度。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved