C 語言標(biāo)準(zhǔn)庫函數(shù)
| 函數(shù)聲明 | 說明 | 注意 | 安全性 |
|---|---|---|---|
int getc(FILE *stream); |
getc 與 fgetc 幾乎一致,區(qū)別在于 getc 為宏,fgetc 為函數(shù),一般來說宏產(chǎn)生較大的代碼,但是避免了函數(shù)調(diào)用的堆棧操作,所以速度會比較快,而宏展開可能對其參數(shù)有不止一次的調(diào)用,為了保險起見不能使用帶有 side effects 的參數(shù),由此可見使用 fgetc 比 getc 要安全。 | side effects | ?? |
int getchar(void); |
調(diào)用時如果 stdin 內(nèi)有字符,則取出 stdin 中的第一個字符返回;否則阻塞等待用戶輸入,直到用戶輸入 '\n' 或者 ^D (EOF) 停止輸入(flush),'\n' 會插入到 stdin 中,EOF 不會插入到 stdin 中,若此時 stdin 內(nèi)有字符,則取出 stdin 中的第一個字符返回,否則返回 EOF (-1) 。相當(dāng)于 getc(stdin)。 | - | ? |
int fgetc(FILE *stream); |
見 getc。 | - | ? |
char *gets(char *s); |
若 stdin 為空,等待用戶輸入,直到用戶輸入 '\n' 或 ^D (EOF) 停止輸入(flush),<u>'\n' 會被換成空字符 '\0'</u>,stdin 的 str 和 '\0' 流入緩沖區(qū) s,如果 strlen(str) 大于 sizeof(s) 會破壞程序堆棧導(dǎo)致程序崩潰,如果調(diào)用成功則返回緩沖區(qū)指針 s。Never use this function! | 緩沖區(qū)溢出 | ? |
char *fgets(char *s, int size, FILE *stream); |
若 stdin 為空,等待用戶輸入,直到用戶輸入 '\n' 或 ^D (EOF) 停止輸入(flush),'\n'會插入到 stdin 中,EOF 不會插入到 stdin 中,stdin 流入緩沖區(qū) s 的字符數(shù)最多為 size-1 個,自動在第 size 個位置補(bǔ)上 '\0',共 size 個字符。如果 size > sizeof(s),當(dāng) stdin 含有足夠多字符時會破壞程序堆棧導(dǎo)致程序崩潰。所以最好取值 size=sizeof(s),即等于緩沖區(qū)大小。fgets 比 gets 要安全。 | size 不能大于緩沖區(qū)s大小 | ?? |
int putc(int c, FILE *stream); |
putc 與 fputc 幾乎一致,區(qū)別在于 putc 為宏,fputc 為函數(shù),一般來說宏產(chǎn)生較大的代碼,但是避免了函數(shù)調(diào)用的堆棧操作,所以速度會比較快,而宏展開可能對其參數(shù)有不止一次的調(diào)用,為了保險起見不能使用帶有 side effects 的參數(shù),由此可見使用 fputc 比 putc 要安全。 | side effects | ?? |
int putchar(int c); |
相當(dāng)于 putc(c, stdout)。 | - | ? |
int fputc(int c, FILE *stream); |
見 putc。 | - | ? |
int puts(const char *s); |
將字符串 s 寫入到 stdout,<u>'\0' 會被換成 '\n'并寫入</u>。 | - | ? |
int fputs(const char *s, FILE *stream); |
將字符串 s 寫入到 stream。 | - | ? |
int scanf(const char *format, ...); |
從 stdin 格式化讀取數(shù)據(jù)。 | - | ? |
int fscanf(FILE *stream, const char *format, ...); |
從 stream 格式化讀取數(shù)據(jù)。 | - | ? |
int sscanf(const char *str, const char *format, ...); |
從字符串?dāng)?shù)組 str 格式化讀取數(shù)據(jù)。 | - | ? |
int printf(const char *format, ...); |
格式化字符串輸出到 stdout。 | - | ? |
int fprintf(FILE *stream, const char *format, ...); |
格式化字符串輸出到 stream。 | - | ? |
int sprintf(char *str, const char *format, ...); |
格式化字符串復(fù)制到緩沖區(qū) str(字符串?dāng)?shù)組)中,如果格式化字符串長度大于 sizeof(str) 即緩沖區(qū)大小,會破壞程序堆棧導(dǎo)致程序崩潰。 | 緩沖區(qū)溢出 | ? |
int snprintf(char *str, size_t size, const char *format, ...); |
與 sprintf 類似,但是可以指定 size 從格式化字符串最多取前 size-1 個字符加一個空字符 '\0' 復(fù)制到緩沖區(qū) str。應(yīng)取值 size = sizeof(str)。 | size 不能大于緩沖區(qū)str的大小 | ?? |
size_t fread(void *ptr, size_t size, size_t nmemb, FILE *stream); |
從 stream 讀取最多 nmemb 個(每個 size 字節(jié)大小)數(shù)據(jù)項存儲到緩沖區(qū) ptr 。如果緩沖區(qū) ptr 不足夠大,可能會發(fā)生緩沖區(qū)溢出。如果調(diào)用成功則返回讀取到的數(shù)據(jù)項個數(shù)。 | size 和 nmemb 的取值大小 | ?? |
size_t fwrite(const void *ptr, size_t size, size_t nmemb, FILE *stream); |
將緩沖區(qū) ptr 中 nmemb 個 (每個 size 字節(jié)大小)數(shù)據(jù)項寫入到 stream。如果調(diào)用成功則返回寫入成功的數(shù)據(jù)項個數(shù)。 | - | ? |
Linux 系統(tǒng)調(diào)用
| 函數(shù)聲明 | 說明 | 注意 | 安全性 |
|---|---|---|---|
ssize_t read(int fd, void *buf, size_t count); |
從文件 fd 中取最多 count 個字符存放在緩沖區(qū) buf 中。該函數(shù)的返回值為讀取到的字節(jié)數(shù)。如果 count > sizeof(buf) 可能發(fā)生緩沖區(qū)溢出。 | cout 的取值大小 | ?? |
ssize_t write(int fd, const void *buf, size_t count); |
將緩沖區(qū) buf 中 count 個字節(jié)寫入到文件 fd。 | - | ? |
更新:
fgets: On linux Ctrl-D only works when the buffer is already empty otherwise it just flushes it. Therefore unless you have pressed enter without any characters after that, you will have to press Ctrl-D twice.