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

C 語言標準庫函數速查:以 S 開頭的函數完整指南(二)

     編輯:關於C語言

前言

承接上篇,本文繼續整理 C 語言標準庫中以字母 S 開頭的重要函數,涵蓋圖形模式控制、數學運算、訊號處理、檔案共享、進程控制、字串格式化、隨機數種子、字串轉換、檔案狀態查詢、時間操作、字串複製比較搜尋等核心功能。每個函數提供語法原型、參數說明與實戰範例。

圖形模式頁面控制

setvisualpage - 設定可視圖形頁面

void far setvisualpage(int pagenum);

在支援多頁面的圖形模式(如 EGA/VGA)中,設定目前顯示的頁面編號。搭配 setactivepage 可實現雙緩衝動畫效果。

setwritemode - 設定繪圖輸出模式

void far setwritemode(int mode);

支援模式:COPY_PUT(覆寫)、XOR_PUT(異或,可刪除重疊圖形)、OR_PUT、AND_PUT、NOT_PUT。常用於遊戲繪圖與光標閃爍效果。

訊號處理:signal

功能

設定特定訊號的處理常式,如捕捉浮點數例外(SIGFPE)、中斷訊號(SIGINT)等。

語法

void (*signal(int sig, void (*func)(int)))(int);

範例:捕捉整數溢位

#include <signal.h>
#include <stdio.h>

void catcher(int sig) {
    printf("Caught signal %d!\n", sig);
}

int main(void) {
    signal(SIGFPE, catcher);
    // 觸發除零或溢位測試
    return 0;
}

數學函數:sin / sinh / sqrt

函數功能語法定義域/值域
sin正弦函數double sin(double x)x 為弧度,回傳 [-1, 1]
sinh雙曲正弦double sinh(double x)全實數域,回傳雙曲正弦值
sqrt平方根double sqrt(double x)x ≥ 0,回傳非負平方根

範例:計算 sin(0.5) 與 sqrt(4.0)

#include <stdio.h>
#include <math.h>

int main(void) {
    double x = 0.5;
    printf("sin(%lf) = %lf\n", x, sin(x));
    printf("sqrt(4.0) = %lf\n", sqrt(4.0));
    return 0;
}

程式暫停:sleep

功能

讓程式暫停執行指定秒數。

語法

unsigned sleep(unsigned seconds);

範例:倒數計時

#include <stdio.h>
#include <unistd.h>  // 或 windows.h 的 Sleep(ms)

int main(void) {
    for (int i = 1; i < 5; i++) {
        printf("Sleeping for %d seconds\n", i);
        sleep(i);
    }
    return 0;
}

共享檔案開啟:sopen

功能

以共享模式開啟檔案,控制其他程式的存取權限。

語法

int sopen(const char *pathname, int access, int shflag, int permiss);
  • access:O_RDONLY、O_WRONLY、O_RDWR 等
  • shflag:SH_DENYNO(允許共享)、SH_DENYRD(拒絕讀取)、SH_DENYWR(拒絕寫入)、SH_DENYRW(獨佔)
  • permiss:檔案權限(S_IREAD、S_IWRITE 等)

喇叭發聲:sound / nosound

功能

控制 PC 喇叭發出指定頻率聲音,nosound() 停止發聲。

語法

void sound(unsigned frequency);
void nosound(void);

範例:發出 7Hz 音調 10 秒

#include <dos.h>

int main(void) {
    sound(7);
    delay(10000);  // 10 秒
    nosound();
    return 0;
}

進程建立:spawnl / spawnle / spawnvp 等系列

spawn 系列函數用於建立並執行子進程,不需經過 shell。

函數特性
spawnl參數列表傳遞,環境繼承自父進程
spawnle參數列表傳遞,可指定環境變數陣列
spawnv參數陣列傳遞,環境繼承
spawnve參數陣列傳遞,可指定環境

模式參數

  • P_WAIT:父進程等待子進程結束
  • P_NOWAIT:父進程繼續執行
  • P_OVERLAY:子進程取代父進程(類似 exec)

範例:啟動編譯器

#include <stdio.h>
#include <stdlib.h>
#include <process.h>

int main(void) {
    int result = spawnl(P_WAIT, "tcc.exe", "tcc.exe", NULL);
    if (result == -1)
        perror("Error from spawnl");
    return 0;
}

格式化字串:sprintf / sscanf

sprintf - 格式化輸出到字串

int sprintf(char *buffer, const char *format, ...);

範例:圓周率字串化

#include <stdio.h>
#include <math.h>

int main(void) {
    char buffer[80];
    sprintf(buffer, "An approximation of Pi is %f\n", M_PI);
    puts(buffer);
    return 0;
}

sscanf - 從字串格式化讀取

int sscanf(const char *buffer, const char *format, ...);

適用於解析固定格式的文字資料,如日期、設定檔等。

隨機數種子:srand

功能

設定 rand() 的種子值,相同種子產生相同序列。

語法

void srand(unsigned seed);

最佳實務

srand((unsigned)time(NULL));  // 以當前時間為種子

檔案狀態查詢:stat / _status87

stat - 取得檔案資訊

int stat(const char *pathname, struct stat *buf);

struct stat 包含:st_mode(檔案類型與權限)、st_dev(裝置號)、st_size(大小)、st_ctime/mtime/atime(時間戳)。

_status87 - 浮點狀態字

unsigned int _status87(void);

回傳 FPU 狀態旗標,可檢測溢位、下溢、精度損失、除零、無效運算等異常。

時間操作:stime / time / localtime / asctime

  • stime:設定系統時間(需權限),int stime(const time_t *tp)
  • time:取得目前時間,time_t time(time_t *timer)
  • localtime:轉換為本地時間結構
  • asctime:格式化時間字串

範例:時間加減運算

#include <stdio.h>
#include <time.h>

int main(void) {
    time_t t = time(NULL);
    struct tm *tm = localtime(&t);
    printf("Current: %s", asctime(tm));
    
    t += 86400;  // 加一天
    tm = localtime(&t);
    printf("Tomorrow: %s", asctime(tm));
    return 0;
}

字串操作大全

函數功能語法
stpcpy複製字串,回傳目的端尾端指標char *stpcpy(char *dest, const char *src)
strcat字串連接char *strcat(char *dest, const char *src)
strchr尋找字元首次出現位置char *strchr(const char *str, int c)
strcmp字串比較(區分大小寫)int strcmp(const char *s1, const char *s2)
strcpy字串複製char *strcpy(char *dest, const char *src)
strcspn計算不含指定字元集的前綴長度size_t strcspn(const char *s1, const char *s2)
strdup動態分配並複製字串char *strdup(const char *s)
stricmp字串比較(不區分大小寫)int stricmp(const char *s1, const char *s2)
strlen字串長度size_t strlen(const char *s)
strncat指定長度字串連接char *strncat(char *dest, const char *src, size_t n)
strncmp指定長度字串比較int strncmp(const char *s1, const char *s2, size_t n)
strncpy指定長度字串複製char *strncpy(char *dest, const char *src, size_t n)
strpbrk尋找任一指定字元首次出現char *strpbrk(const char *s1, const char *s2)
strrchr尋找字元最後一次出現位置char *strrchr(const char *str, int c)
strrev字串反轉char *strrev(char *str)
strset設定字串所有字元為指定值char *strset(char *str, int c)
strspn計算僅含指定字元集的前綴長度size_t strspn(const char *s1, const char *s2)
strstr尋找子字串首次出現位置char *strstr(const char *haystack, const char *needle)
strtok字串分割char *strtok(char *str, const char *delim)
strupr轉大寫char *strupr(char *str)
strlwr轉小寫char *strlwr(char *str)

關鍵函數範例

strtok - 字串分割

#include <stdio.h>
#include <string.h>

int main(void) {
    char input[] = "apple,banana,orange";
    char *token = strtok(input, ",");
    while (token) {
        printf("%s\n", token);
        token = strtok(NULL, ",");
    }
    return 0;
}

strtod / strtol - 字串轉數值

double strtod(const char *str, char **endptr);
long strtol(const char *str, char **endptr, int base);

endptr 可檢測轉換結束位置,實現健壯的輸入解析。

位元組交換:swab

功能

交換相鄰位元組,常用於大小端轉換。

語法

void swab(const char *from, char *to, int nbytes);

範例:字元對調

#include <stdio.h>
#include <unistd.h>

int main(void) {
    char src[] = "rFna koBlrna d";
    char dst[15];
    swab(src, dst, strlen(src));
    printf("%s\n", dst);  // 輸出 "Franklin Board"
    return 0;
}

系統命令執行:system

功能

呼叫命令解釋器執行字串命令。

語法

int system(const char *command);

範例:執行目錄列表

#include <stdlib.h>

int main(void) {
    printf("Running DOS command...\n");
    system("dir");
    return 0;
}

安全警告:避免在輸入未經驗證的使用者資料時使用 system(),防止命令注入攻擊。


本文詳細整理了 C 語言 S 開頭的核心庫函數,從圖形控制、數學運算、訊號處理、進程管理、字串操作到系統呼叫,提供完整的語法參考與實戰範例。熟練掌握這些函數,能大幅提升 C 程式開發的效率與程式碼品質。

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