C語言中常用的幾個頭文件及庫函數 (stdio.h ,string.h ,math.h ,stdlib.h)

(參考:https://www.jb51.net/article/124594.htm

     #include<stdio.h> 或 #include"stdio.h"

     用#include<stdio.h>形式時,編譯系統從存放C編譯系統的子目錄中去找所包含的文件stdio.h,這稱爲標準方式。

     用#include"stdio.h"形式時,編譯系統先在用戶的當前目錄(用戶存放源程序文件的子目錄)中尋找stdio.h,若找不到,再按標準方式查找。如果該頭文件不在當前目錄,可加入路徑如(#include "C:\temp\file1.h")。

 

不完全統計,C語言標準庫中的頭文件有15個之多,所以我主要介紹常用的這四個頭文件stdio.h ,string.h ,math.h ,stdlib.h ,以後用到其他的再做補充。下面上乾貨:

1.<stdio.h>:定義了(standard input & output的縮寫)輸入輸出函數、類型以及宏,函數幾乎佔了標準庫的1/3。

(1)文件訪問。

1

FILE *fopen(“filename”,“mode”):

以mode模式打開地址爲'filename'的文件,並返回文件指針。

訪問模式主要是“r”:只讀;   “w” :只寫,並刪除已有內容;  “a”:追加,在末尾追加;

 “r+”, “w+”:讀寫; “a+”追加,上述結尾加“b”:二進制文件操作。

注意:其中r是打開文件,而w會創建(如果文件不存在);  w會覆蓋原有內容,a則是在原有文件末尾追加。

FILE *fp ;                    / 定義一個指向文件的指針變量fp
fp = fopen("a1","r");         / 將fopen函數的返回值(a1文件信息區的起始地址)賦給指針變量fp
表示要打開名字爲“a1”的文件,使用文件方式爲"r"讀入。

2

int fcloseFILE *f):

fclose(文件指針); 釋放緩衝區數據,關閉流。如:fclose(fp); 前面曾把打開文件(用fopen函數)時函數返回的指針賦給了fp,現在把fp指向的文件關閉,此後fp不再指向該文件。當成功執行操作,則返回值爲0,否則返回EOF(-1)。

下面兩個沒太用過:

1

FILE *freopen(“filename”,“mode”,FILE * f):

以mode模式打開地址爲'filename'的文件,並將該文件與流f2關聯。

1

int fflushFILE *f):

將已寫到緩衝區但未寫入文件中的所有數據寫入文件中。

(2)二進制輸入/輸出

1

fread(*ptr,size,n,FILE* f):

從f中讀取n個長度爲size的對象,並放入ptr指向的數組中。

1

fwrite(*ptr,size,n,FILE* f):

從ptr指向數組中讀取n個長度爲size的對象,並寫入f中。

注意:要注意write與read的對象,讀和寫都是針對文件流f的。

(3)非格式化輸入/輸出

1

int fgetc/getcFILE *f):

返回流f 的下一個字符,到達文件末尾/發生錯誤,則返回EOF。

1

int fputc/putcint c, FILE *f)

將字符c輸入到流f中。

1

int fgetschar * s,int n,FILE *f):

將f中下n-1個字符讀入到數組s中。遇到換行符,則終止。

1

int fputsconst char * s,FILE *f):

將字符串s輸出到流中。

1

int ungetint c, FILE *f)

將c寫回到f中。

(4)格式化輸入/輸出

按一定格式轉輸出。

1

2

scanf/fscanf/sscanf

printf/fprintf/sprintf

注意:1,不加f/s,則是格式字符串標準輸入/出函數,輸入/出到終端/屏幕;

          printf(格式控制,輸出形式);     例:printf( "%d , %c\n" , i , c);

                                                                   printf(const char *format,...)

2,加s,輸入/出到字符串中。sprintf(char *s,const char *format,...),

3,加f,輸入/出到文件流中。  fprintf(FILE *f,const char *format,...)

          scanf(格式控制,地址表列);     例:scanf("a=%f,b=%f,c=%f" ,&a, &b ,&c);

          putchar (c);  輸出一個字符

           getchar ( );  輸入一個字符

(5)文件定位

1

long ftellFILE *f):

返回當前指針位置。錯誤時返回-1L。

1

int fseekFILE *f,long offset,int origin):

將當前流f指針位置設置到:origin後offset個字符處。origin有:SEEK_SET:文件起始位置;SEEK_CUR指針當前位置,SEEK_END:文件結束位置。

1

void rewindFILE *f)

指針返回文件開始位置,相當於:fseek(f,0L,SEEK_SET)

不常用:

1

int fgetposFILE *f,*p)

將指針當前位置記錄到*p中,以供fsetpos函數使用。

1

int fsetposFILE *f,const *p)

指針位置指向*p。

(6)錯誤處理與文件操作

1

int feofFILE *f)

指示文件結束,一直返回0,結束時返回非0值。

1

int ferrorFILE *f)

如果設置了與f相關的錯誤指示符,則返回一個非0值。

1

int removechar *filename)

刪除指定位置的文件。

1

int renameconst char *oldname,const char *newname)

改文件名,否則返回非0值。

1

FILE *tmpfilevoid

建立臨時文件,‘wb+'模式,在被關閉或程序正常結束時自動刪除

 

2. <string.h> 分成兩組,一組str開頭,一組mem開頭(該組函數在<memory.h>中也有定義,不是所有編譯器都有)

(1)str

      puts(字符數據);       輸出字符串函數

       例:char str[]="china";    puts(str);

       gets(字符數組);     輸入字符串函數

        例:gets(str);

1

char * strcpy (char *dest, const char *src); //字符串複製函數,把字符串2和後面的'\0'複製到字符數組1中。

例:char str1[10],str2[]="china";    strcpy(str1,str2); 注:str1必須夠大,以便能放下str2

將字符串src複製到字符串dest中(包括'\0'),返回dest

1

char * strncpy (char *dest, const char *src,n); //字符串複製函數,將字符串2中前面的n個字符複製到字符數組1中,n必須少於str1的字符,不包括('\0')。

例:char str1[10],str2[]="china"; strncpy(str1, str2, 2)  輸出結果爲str1="ch"

將src中的前n個字符複製到dest中,返回dest,不夠n個則補‘\0'

char * strcat (char *dest, const char *src);   //字符串連接函數,把字符串2連接到字符串1的後面,結果放到字符數組1中。

 例:char str1[10]="good "; char str2[]="boy";  strcat(str1,str2); 注:str1必須夠大,以便能放下str2。

 

char * strncat (char *dest, const char *src,n);

src連接到dest後;src 中前n個字符連接到dest後。

int  strcmp (const char *s1, const char *s2);  //字符串比較函數,比較字符串1和字符串2,將2個字符串自左至右逐個字符比較(按ASCII碼值大小比較),直到出現不同的字符或遇到'\0'爲止。

例:char str1[]="china "; char str2[]="korea"; strcmp(str1,str2); k比c大,所以函數值爲負。

  如果str1=str2,則函數值爲0; 如果str1>str2,則函數值爲正; 如果str1<str2,則函數值爲負。 如: if(strcmp(str1,str2)=0)

 

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

      strlen(字符數組);    //測字符串長度的函數,字符串實際長度(不包括'\0')

       例:char str[10]="china";  printf("%d",strlenn(str)) ; 輸出的結果不是10也不是6,而是5

       strlwr(字符串);      //轉換爲 小寫 的函數,將字符串中的大寫字母轉換爲小寫字母

        strupr(字符串);  //轉換爲 大寫 的函數,將字符串的小寫字母轉換爲大寫字母

不常見 size_t   strcspn (const char *s1, const char *s2); char * strdup (const char *s); char * strerror(int errnum);

(2)mem

1

void *memcpyvoid *s, const void *ct,n)

將字符串ct中的前n個字符拷貝到s中,並返回s。

1

2

void *memmove(s,ct,n)同上一函數,只是在對象重疊時仍能正確執行。

void *memsetvoid *s,int c, n)

void *memset(void *s, int c, size_t n);

函數解釋:將s中當前位置後面的n個字節 (typedef unsigned int size_t )用 c 替換並返回 s 。

memset:作用是在一段內存塊中填充某個給定的值,它是對較大的結構體數組進行清零操作的一種最快方法 [1]。

memset()函數原型是extern void *memset(void *buffer, int c, int count) buffer:爲指針或是數組,c:是賦給buffer的值,count:是buffer的長度

將s中的前n個字符替換成c,並返回s。

1

int memcmp(cs,ct,n)

將cs前n個字符與ct進行比較,cs<ct,返回負數;否則返回0

1

void *memchr(cs,c,n)

返回指向c在cs中第一次出現的位置指針。

 

3.<math.h>一些數學函數

求絕對值

1

2

3

int abs  (int x);

long labs (long x);

float fabs float x):

所有返回值均爲double,三角函數角度用弧度表示,x,y均爲double

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

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>數值轉換、內存分配等問題。

1

int randvoid

產生一個0~32767之間的隨機整數。

 

void *malloc(unsigned int size);

    作用是在內存的動態存儲區中分配一個長度爲size(不允許爲負數)的連續空間。此函數的值(即“返回值”)是分配區域的第一個字節的地址,或者說,此函數是一個指針型函數,不指向任何類型的數據,只提供一個地址,返回的指針指向該分配域的開頭位置,如內存空間不足則返回空指針NULL。如: 

        malloc(100);   //開闢100字節的心事分配域,函數值爲其第一個字節的地址

void *calloc(unsiggned n,unsigned size);

    作用是在內存的動態存儲區分配n個長度爲size的連續空間,這個空間一般比較大,足以保存一個數組,可以爲一維數組開闢動態存儲空間,n爲數組元素個數,每個元素長度爲size,這是動態數組。函數返回指向所分配域的起始位置的指針,如果分配不成功則返回NULL。如:

       p=calloc(50,4); //開闢50x4個字節的臨時分匹配域,把起始地址賦給指針變量p

void free(void *p);

    作用是釋放指針變量p所指向的動態空間(p爲malloc,realloc,calloc最近一次所開闢的內存),使這部分空間能重新被其他變量使用。如;

        free(p);  //釋放指針變量p所指向的已分配的動態空間   free函數無返回值

void *realloc(void *p,uunsigned int size);

    如果已經通過malloc或calloc函數獲得了動態空間,想改變其大小,可以用realloc函數重新分配,用realloc函數將p所指向的動態空間的大小改爲size,如果重分配不成功,則返回NULL。如:

        realloc(p,50);  //將p所指向的已分配的動態空間改爲50字節

 

1

void abortvoid

使程序非正常終止。

1

void exitint status)

使程序正常終止。

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章