C 語(yǔ)言標(biāo)準(zhǔn)庫(kù)函數(shù)
函數(shù)聲明 | 說(shuō)明 | 注意 | 安全性 |
---|---|---|---|
int getc(FILE *stream); |
getc 與 fgetc 幾乎一致花枫,區(qū)別在于 getc 為宏基茵,fgetc 為函數(shù)墙歪,一般來(lái)說(shuō)宏產(chǎn)生較大的代碼频伤,但是避免了函數(shù)調(diào)用的堆棧操作倔韭,所以速度會(huì)比較快术浪,而宏展開(kāi)可能對(duì)其參數(shù)有不止一次的調(diào)用,為了保險(xiǎn)起見(jiàn)不能使用帶有 side effects 的參數(shù)寿酌,由此可見(jiàn)使用 fgetc 比 getc 要安全胰苏。 | side effects | ?? |
int getchar(void); |
調(diào)用時(shí)如果 stdin 內(nèi)有字符,則取出 stdin 中的第一個(gè)字符返回醇疼;否則阻塞等待用戶輸入硕并,直到用戶輸入 '\n' 或者 ^D (EOF) 停止輸入(flush)法焰,'\n' 會(huì)插入到 stdin 中,EOF 不會(huì)插入到 stdin 中倔毙,若此時(shí) stdin 內(nèi)有字符埃仪,則取出 stdin 中的第一個(gè)字符返回,否則返回 EOF (-1) 陕赃。相當(dāng)于 getc(stdin)卵蛉。 | - | ? |
int fgetc(FILE *stream); |
見(jiàn) getc。 | - | ? |
char *gets(char *s); |
若 stdin 為空凯正,等待用戶輸入毙玻,直到用戶輸入 '\n' 或 ^D (EOF) 停止輸入(flush),<u>'\n' 會(huì)被換成空字符 '\0'</u>廊散,stdin 的 str 和 '\0' 流入緩沖區(qū) s桑滩,如果 strlen(str) 大于 sizeof(s) 會(huì)破壞程序堆棧導(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'會(huì)插入到 stdin 中胁澳,EOF 不會(huì)插入到 stdin 中,stdin 流入緩沖區(qū) s 的字符數(shù)最多為 size-1 個(gè)米者,自動(dòng)在第 size 個(gè)位置補(bǔ)上 '\0'韭畸,共 size 個(gè)字符。如果 size > sizeof(s)蔓搞,當(dāng) stdin 含有足夠多字符時(shí)會(huì)破壞程序堆棧導(dǎo)致程序崩潰胰丁。所以最好取值 size=sizeof(s),即等于緩沖區(qū)大小喂分。fgets 比 gets 要安全锦庸。 | size 不能大于緩沖區(qū)s大小 | ?? |
int putc(int c, FILE *stream); |
putc 與 fputc 幾乎一致,區(qū)別在于 putc 為宏蒲祈,fputc 為函數(shù)甘萧,一般來(lái)說(shuō)宏產(chǎn)生較大的代碼,但是避免了函數(shù)調(diào)用的堆棧操作梆掸,所以速度會(huì)比較快扬卷,而宏展開(kāi)可能對(duì)其參數(shù)有不止一次的調(diào)用,為了保險(xiǎn)起見(jiàn)不能使用帶有 side effects 的參數(shù)酸钦,由此可見(jiàn)使用 fputc 比 putc 要安全怪得。 | side effects | ?? |
int putchar(int c); |
相當(dāng)于 putc(c, stdout)。 | - | ? |
int fputc(int c, FILE *stream); |
見(jiàn) putc。 | - | ? |
int puts(const char *s); |
將字符串 s 寫(xiě)入到 stdout汇恤,<u>'\0' 會(huì)被換成 '\n'并寫(xiě)入</u>。 | - | ? |
int fputs(const char *s, FILE *stream); |
將字符串 s 寫(xiě)入到 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ù)組)中河爹,如果格式化字符串長(zhǎng)度大于 sizeof(str) 即緩沖區(qū)大小匠璧,會(huì)破壞程序堆棧導(dǎo)致程序崩潰。 | 緩沖區(qū)溢出 | ? |
int snprintf(char *str, size_t size, const char *format, ...); |
與 sprintf 類似咸这,但是可以指定 size 從格式化字符串最多取前 size-1 個(gè)字符加一個(gè)空字符 '\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 個(gè)(每個(gè) size 字節(jié)大小)數(shù)據(jù)項(xiàng)存儲(chǔ)到緩沖區(qū) ptr 媳维。如果緩沖區(qū) ptr 不足夠大酿雪,可能會(huì)發(fā)生緩沖區(qū)溢出。如果調(diào)用成功則返回讀取到的數(shù)據(jù)項(xiàng)個(gè)數(shù)侄刽。 | size 和 nmemb 的取值大小 | ?? |
size_t fwrite(const void *ptr, size_t size, size_t nmemb, FILE *stream); |
將緩沖區(qū) ptr 中 nmemb 個(gè) (每個(gè) size 字節(jié)大小)數(shù)據(jù)項(xiàng)寫(xiě)入到 stream指黎。如果調(diào)用成功則返回寫(xiě)入成功的數(shù)據(jù)項(xiàng)個(gè)數(shù)。 | - | ? |
Linux 系統(tǒng)調(diào)用
函數(shù)聲明 | 說(shuō)明 | 注意 | 安全性 |
---|---|---|---|
ssize_t read(int fd, void *buf, size_t count); |
從文件 fd 中取最多 count 個(gè)字符存放在緩沖區(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 個(gè)字節(jié)寫(xiě)入到文件 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.