承接上篇,本文繼續整理 C 語言標準庫中以字母 S 開頭的重要函數,涵蓋圖形模式控制、數學運算、訊號處理、檔案共享、進程控制、字串格式化、隨機數種子、字串轉換、檔案狀態查詢、時間操作、字串複製比較搜尋等核心功能。每個函數提供語法原型、參數說明與實戰範例。
void far setvisualpage(int pagenum);
在支援多頁面的圖形模式(如 EGA/VGA)中,設定目前顯示的頁面編號。搭配 setactivepage 可實現雙緩衝動畫效果。
void far setwritemode(int mode);
支援模式:COPY_PUT(覆寫)、XOR_PUT(異或,可刪除重疊圖形)、OR_PUT、AND_PUT、NOT_PUT。常用於遊戲繪圖與光標閃爍效果。
設定特定訊號的處理常式,如捕捉浮點數例外(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 | 正弦函數 | double sin(double x) | x 為弧度,回傳 [-1, 1] |
| sinh | 雙曲正弦 | double sinh(double x) | 全實數域,回傳雙曲正弦值 |
| sqrt | 平方根 | double sqrt(double x) | x ≥ 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;
}
讓程式暫停執行指定秒數。
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;
}
以共享模式開啟檔案,控制其他程式的存取權限。
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 等)控制 PC 喇叭發出指定頻率聲音,nosound() 停止發聲。
void sound(unsigned frequency);
void nosound(void);
#include <dos.h>
int main(void) {
sound(7);
delay(10000); // 10 秒
nosound();
return 0;
}
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;
}
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;
}
int sscanf(const char *buffer, const char *format, ...);
適用於解析固定格式的文字資料,如日期、設定檔等。
設定 rand() 的種子值,相同種子產生相同序列。
void srand(unsigned seed);
srand((unsigned)time(NULL)); // 以當前時間為種子
int stat(const char *pathname, struct stat *buf);
struct stat 包含:st_mode(檔案類型與權限)、st_dev(裝置號)、st_size(大小)、st_ctime/mtime/atime(時間戳)。
unsigned int _status87(void);
回傳 FPU 狀態旗標,可檢測溢位、下溢、精度損失、除零、無效運算等異常。
int stime(const time_t *tp)time_t time(time_t *timer)#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) |
#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;
}
double strtod(const char *str, char **endptr);
long strtol(const char *str, char **endptr, int base);
endptr 可檢測轉換結束位置,實現健壯的輸入解析。
交換相鄰位元組,常用於大小端轉換。
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;
}
呼叫命令解釋器執行字串命令。
int system(const char *command);
#include <stdlib.h>
int main(void) {
printf("Running DOS command...\n");
system("dir");
return 0;
}
安全警告:避免在輸入未經驗證的使用者資料時使用 system(),防止命令注入攻擊。
本文詳細整理了 C 語言 S 開頭的核心庫函數,從圖形控制、數學運算、訊號處理、進程管理、字串操作到系統呼叫,提供完整的語法參考與實戰範例。熟練掌握這些函數,能大幅提升 C 程式開發的效率與程式碼品質。