C語言中自帶的標頭檔案(.h)所包含的函式
由於之前沒有好好學習過C語言,所以對其自帶標頭檔案所包含的內容總是不清楚,每次寫程式碼都是盲目的#include很多.h,現在重新整理一下,發現了不少很好的函式,以方便複習查閱。
不完全統計,C語言標準庫中的標頭檔案有15個之多,所以我主要介紹常用的這四個標頭檔案stdio.h,string.h,math.h,stdlib.h,以後用到其他的再做補充。下面上乾貨:
1.<stdio.h>:定義了輸入輸出函式、型別以及巨集,函式幾乎佔了標準庫的1/3。
(1)檔案訪問。
FILE *fopen(“filename”,“mode”):
以mode模式開啟地址為'filename'的檔案,並返回檔案指標。
訪問模式主要是“r”:只讀; “w” :只寫,並刪除已有內容; “a”:追加,在末尾追加;
“r+”, “w+”:讀寫; “a+”追加,上述結尾加“b”:二進位制檔案操作。
注意:其中r是開啟檔案,而w會建立(如果檔案不存在); w會覆蓋原有內容,a則是在原有檔案末尾追加。
int fclose(FILE *f):
釋放緩衝區資料,關閉流。
下面兩個沒太用過:
FILE *freopen(“filename”,“mode”,FILE * f):
以mode模式開啟地址為'filename'的檔案,並將該檔案與流f2關聯。
int fflush(FILE *f):
將已寫到緩衝區但未寫入檔案中的所有資料寫入檔案中。
(2)二進位制輸入/輸出
fread(*ptr,size,n,FILE* f):
從f中讀取n個長度為size的物件,並放入ptr指向的陣列中。
fwrite(*ptr,size,n,FILE* f):
從ptr指向陣列中讀取n個長度為size的物件,並寫入f中。
注意:要注意write與read的物件,讀和寫都是針對檔案流f的。
(3)非格式化輸入/輸出
int fgetc/getc(FILE *f):
返回流f的下一個字元,到達檔案末尾/發生錯誤,則返回EOF。
int fputc/putc(int c, FILE *f)
將字元c輸入到流f中。
int fgets(char * s,int n,FILE *f
將f中下n-1個字元讀入到陣列s中。遇到換行符,則終止。
int fputs(const char * s,FILE *f):
將字串s輸出到流中。
int unget(int c, FILE *f)
將c寫回到f中。
(4)格式化輸入/輸出
按一定格式轉輸出。
scanf/fscanf/sscanf
printf/fprintf/sprintf
注意:不加f/s,則是格式字串標準輸入/出函式,輸入/出到終端/螢幕;printf(const char *format,...)
加s,輸入/出到字串中。sprintf(char *s,const char *format,...)
加f,輸入/出到檔案流中。 fprintf(FILE *f,const char *format,...)
(5)檔案定位
long ftell(FILE *f):
返回當前指標位置。錯誤時返回-1L。
int fseek(FILE *f,long offset,int origin):
將當前流f指標位置設定到:origin後offset個字元處。origin有:SEEK_SET:檔案起始位置;SEEK_CUR指標當前位置,SEEK_END:檔案結束位置。
void rewind(FILE *f)
指標返回檔案開始位置,相當於:fseek(f,0L,SEEK_SET)
不常用:
int fgetpos(FILE *f,*p)
將指標當前位置記錄到*p中,以供fsetpos函式使用。
int fsetpos(FILE *f,const *p)
指標位置指向*p。
(6)錯誤處理與檔案操作
int feof(FILE *f)
指示檔案結束,一直返回0,結束時返回非0值。
int ferror(FILE *f)
如果設定了與f相關的錯誤指示符,則返回一個非0值。
int remove(char *filename)
刪除指定位置的檔案。
int rename(const char *oldname,const char *newname)
改檔名,否則返回非0值。
FILE *tmpfile(void)
建立臨時檔案,‘wb+’模式,在被關閉或程式正常結束時自動刪除
2.<string.h> 分成兩組,一組str開頭,一組mem開頭(該組函式在<memory.h>中也有定義,不是所有編譯器都有)
(1)str
char * strcpy (char *dest, const char *src);
將字串src複製到字串dest中(包括'\0'),返回dest
char * strncpy (char *dest, const char *src,n);
將src中的前n個字元複製到dest中,返回dest,不夠n個則補‘\0’
char * strcat (char *dest, const char *src);
char * strncat (char *dest, const char *src,n);
src連線到dest後;src 中前n個字元連線到dest後。
int strcmp (const char *s1, const char *s2);
int strncmp (const char *s1, const char *s2,n);
比較s1與s2,s1<s2則返回負數,否則返回0;比較前n個字元
char * strchr (const char *s, int c);
char * strrchr (const char *s, int c);
返回字串s中第一次出現字元c的位置指標;返回字串s中最後一次出現字元c的位置指標(c會轉換成char)
不常見
size_t strcspn (const char *s1, const char *s2);
char * strdup (const char *s);
char * strerror(int errnum);
(2)mem
void *memcpy(void *s, const void *ct,n)
將字串ct中的前n個字元拷貝到s中,並返回s。
void *memmove(s,ct,n)同上一函式,只是在物件重疊時仍能正確執行。
void *memset(void *s,int c, n)
將s中的前n個字元替換成c,並返回s。
int memcmp(cs,ct,n)
將cs前n個字元與ct進行比較,cs<ct,返回負數;否則返回0
void *memchr(cs,c,n)
返回指向c在cs中第一次出現的位置指標。
3.<math.h>一些數學函式
求絕對值
int abs (int x);
long labs (long x);
float fabs (float x):
所有返回值均為double,三角函式角度用弧度表示,x,y均為double
double acos (x);
double asin (x);
double atan (x);
double atan2 (y, x): arctan(y/x)
double tan (x);
double tanh (x): 雙曲正切
double sin (x);
double sinh (x);
double cos (x);
double cosh (x);
double pow (x, y);
double sqrt (x);
double ceil (x): 不小於x的最小整型數(向上取整)
double floor (x): 不大於x的最大整型數(向下取整)
double exp (x);
double fabs (x);
double log (x): ln(x)
double log10 (x);
double fmod (x, y): x/y的餘數
double ldexp (x, n): x*2^n
double modf (x, double *ip): 將x分成整數與小數兩部分,返回小數部分,整數部分放在*ip中
double frexp (x, int *exp); 將x分成(0.5,1)之間的一個真分數和一個2的冪數,返回真分數,冪數放在exp中
4.<stdlib.h>數值轉換、記憶體分配等問題。
int rand(void)
產生一個0~32767之間的隨機整數。
指標名=(資料型別 *)calloc(n,size)
分配n個長度為size的連續空間,並且將所有元素置零,返回首地址。
指標名=(資料型別 *)malloc(n*size)
分配n*size個位元組的記憶體,並返回首地址。
指標名p1=(資料型別 *)realloc(要改變記憶體大小的指標名p2,新的大小n)
分配長度為n位元組的空間,將p2值賦值到該記憶體中,返回首地址到p1.(改變p1指向地址的記憶體大小)
void free(*p)
釋放p指向的記憶體(p為malloc,realloc,calloc所開闢的記憶體)
void abort (void)
使程式非正常終止。
void exit(int status)
使程式正常終止。
以上是我總結的一些標頭檔案所包含的函式,由於時間倉促加上本人接觸C不久,難免有所紕漏,讀者可作為參考,發現問題還望指出,共同學習。
上面並未介紹所有的標頭檔案,所介紹標頭檔案包含的函式也只列出了一些常用的,後面學習繼續補充吧。。