C語言常(chang)用函(han)數用法大全
時間:2018-01-04 來(lai)源:未知
C語(yu)(yu)言(yan)(yan)(yan)是當(dang)中(zhong)廣(guang)泛的(de)(de)計(ji)算(suan)(suan)機(ji)編(bian)程(cheng)語(yu)(yu)言(yan)(yan)(yan),是所有(you)計(ji)算(suan)(suan)機(ji)編(bian)程(cheng)語(yu)(yu)言(yan)(yan)(yan)的(de)(de)祖先,其他計(ji)算(suan)(suan)機(ji)編(bian)程(cheng)語(yu)(yu)言(yan)(yan)(yan)包括當(dang)前流行(xing)的(de)(de)Java語(yu)(yu)言(yan)(yan)(yan),都是用C語(yu)(yu)言(yan)(yan)(yan)實(shi)現(xian)的(de)(de),C語(yu)(yu)言(yan)(yan)(yan)是編(bian)程(cheng)效率高(gao)的(de)(de)計(ji)算(suan)(suan)機(ji)語(yu)(yu)言(yan)(yan)(yan),既能(neng)完(wan)成上層(ceng)應(ying)用開發(fa),也能(neng)完(wan)成底(di)層(ceng)硬件(jian)驅(qu)動編(bian)程(cheng),在計(ji)算(suan)(suan)機(ji)程(cheng)序設計(ji)當(dang)中(zhong),特別是在底(di)層(ceng)硬件(jian)驅(qu)動開發(fa)當(dang)中(zhong),具(ju)有(you)不可替代的(de)(de)作用。在C語(yu)(yu)言(yan)(yan)(yan)學(xue)(xue)習過程(cheng)當(dang)中(zhong),除了學(xue)(xue)習好C語(yu)(yu)言(yan)(yan)(yan)基(ji)本(ben)語(yu)(yu)法外,掌握常(chang)用的(de)(de)C語(yu)(yu)言(yan)(yan)(yan)庫(ku)函(han)數(shu)的(de)(de)使用也是非常(chang)重要(yao)的(de)(de),本(ben)文主要(yao)給同學(xue)(xue)們詳細(xi)講解在實(shi)際項目開發(fa)過程(cheng)中(zhong)常(chang)用C語(yu)(yu)言(yan)(yan)(yan)函(han)數(shu)的(de)(de)用法。
1 printf 函數
函數原型(xing):int printf(const char *format,[argument]);
功(gong)能:實現格式(shi)化輸入輸出
返(fan)回(hui)值:實(shi)際輸出(chu)的字(zi)符個數(shu)
函數(shu)參(can)數(shu):format 格式化字符(fu)串
argument 要輸出(chu)的參數
常用的格式化(hua)類型有:
d 有符號10進制整數
o 無(wu)符號8進制(zhi)整數
u 無符號10進制整數
x 無(wu)符號(hao)的16進(jin)制數字(zi),并以小寫abcdef表示
X 無(wu)符號的16進制數字,并以大(da)寫ABCDEF表(biao)示
f 浮點數
c 單個字符
s 字符串
p 顯(xian)示(shi)(shi)一個指(zhi)(zhi)針,near指(zhi)(zhi)針表示(shi)(shi)為:XXXX,far指(zhi)(zhi)針表示(shi)(shi)為:XXXX:YYYY
用法舉例:
以(yi)10進制形(xing)式輸出(chu)整形(xing)變(bian)量(liang)a的(de)值;
int a = 100;
printf("a=%d\n", a);
上面程序的執行結(jie)果為:在屏幕終端輸出 a=100
2 fprintf函數
函數(shu)原型:int fprintf (FILE* stream, const char*format, [argument])
功能:將按照格式化字符(fu)串格式化后(hou)的數據(ju)輸出到文件流stream中,
返回值:實際寫入(ru)到(dao)文(wen)件的字符個數
函數參數:stream 要(yao)輸出的文件流指(zhi)針(zhen)
format 格式化字符串
argument 要輸出(chu)的參數
備注:fprintf和printf函(han)數非(fei)常(chang)類似,使用方法也相同,它們不同之處在于printf函(han)數是(shi)輸(shu)出(chu)(chu)結(jie)果(guo)(guo)到(dao)標(biao)準輸(shu)出(chu)(chu)終(zhong)端,一(yi)般為(wei)屏(ping)幕,而fprintf是(shi)將(jiang)結(jie)果(guo)(guo)輸(shu)出(chu)(chu)到(dao)指定的文(wen)件流(liu);如果(guo)(guo)將(jiang)參(can)數輸(shu)出(chu)(chu)文(wen)件流(liu)stream設置為(wei)標(biao)準輸(shu)出(chu)(chu)流(liu)stdout,則與(yu)printf函(han)數等(deng)效,如下所示(shi):
fprintf (stdout, const char*format, [argument])
用法舉例:
例如:將一個格式(shi)化字(zi)符串(chuan)寫入到文件file1.txt中
FILE *fp = fopen("file1.txt","wb");
int count = 190;
fprintf(fp,"hello :%d\n", count);
上面程序(xu)的執(zhi)行結果為(wei)往file1.txt文(wen)件中寫入 "hello :190" 字符串.
3 sprintf 函數
函數原型:int sprintf (char* buffer, const char*format, [argument])
功能:將按(an)照(zhao)格式(shi)化字符串格式(shi)化后的數據輸出到字符串buffer中
返回(hui)值:實際輸出到字(zi)符串buffer的字(zi)符個(ge)數
函數參數:buffer 要輸出的字符串指針
format 格(ge)式化字(zi)符串
argument 要輸出的參(can)數(shu)
備注:sprintf和printf函(han)數非(fei)常(chang)類似,使用方法也相同(tong),它們不同(tong)之處在于printf函(han)數是(shi)輸(shu)出(chu)結(jie)果(guo)到(dao)標準輸(shu)出(chu)終端(duan),一(yi)般為屏幕,而sprintf是(shi)將結(jie)果(guo)輸(shu)出(chu)到(dao)指(zhi)定的字符串buffer;
用法舉例:
將一(yi)個格式(shi)化字符串寫(xie)入(ru)到(dao)目標字符串buffer中
char buffer[50] = {0};
int count = 190;
fprintf(buffer,"hello :%d\n", count);
上面程序執行(xing)后,buffer中保存字符串 "hello :190"
4 scanf 函數
函數原型:int scanf(char *format [,argument,...])
功能(neng):從標準輸入(ru)設備(一(yi)般(ban)指(zhi)鍵(jian)盤)實現(xian)格式化輸入(ru)
返(fan)回值:成(cheng)功(gong)返(fan)回讀入的數據項個數
函數參數:format 格式化字符串
argument 輸入(ru)數據項(xiang)的地址列表
常用格式(shi)類(lei)型(xing)參考(kao)printf函數的個格式(shi)類(lei)型(xing)
用法舉例:
從標(biao)準輸(shu)入(ru)設(she)備(bei)中(zhong)輸(shu)入(ru)一個(ge)整數(shu)到整形變量a中(zhong),輸(shu)入(ru)一個(ge)浮(fu)點(dian)數(shu)到浮(fu)點(dian)型變量b中(zhong)
int a=0;
float b=0;
scanf("%d%f",&a,&b);
上面程序(xu)執行后,從鍵(jian)盤輸入(ru): 19 18.6 ,程序(xu)將(jiang) 19賦值給(gei)變量a, 18.6賦值給(gei)變量b .
備注: scanf 函數格式化字(zi)符串(chuan)中不能(neng)加(jia) \n,如上(shang)例中這(zhe)樣寫 scanf("%d%f\n",&a,%b) 是錯(cuo)誤(wu)的。
5 sscanf 函數
函數(shu)原(yuan)型:int sscanf(const char *buffer, char *format [,argument,...])
功能:讀取格式化字符串中的位置(zhi)
返(fan)回值(zhi):成功返(fan)回讀(du)入(ru)的數據項(xiang)個數
函數參數:buffer 要讀取的格式化字符串(chuan)
format 格式化(hua)字符串
argument 輸入(ru)數據項的(de)地址(zhi)列表
備注(zhu): sscanf函數的(de)使用和scanf函數非常類似,它們之間的(de)區別在(zai)于 scanf函數是從標準輸入(ru)(ru)設備輸入(ru)(ru),而(er)sscanf 是從指定(ding)的(de)字(zi)符(fu)串輸入(ru)(ru);
用法舉例:
通常使用sscanf函數(shu)類實現數(shu)據類型轉換,將字符(fu)串轉換為整形或浮點型數(shu)據,舉例如下(xia):
char str[]="0x1a";
int b=0;
sscanf(str,"0x%x",&b);
上面程序的(de)執(zhi)行(xing)結(jie)果將字符串(chuan)0x1a 轉換(huan)成對(dui)應的(de)16進制(zhi)值保存到變(bian)量b中 .
6 getchar 函數
函數(shu)原型: int getchar(void)
功能(neng)(neng): getchar 函數(shu)的(de)功能(neng)(neng)是從(cong)標準(zhun)輸入設備讀(du)取(qu)下(xia)一(yi)個字符,包括(kuo)回(hui)車換行符都能(neng)(neng)讀(du)取(qu)
返(fan)回值: 成功(gong)返(fan)回用戶輸入(ru)字(zi)符對應(ying)的ASCII碼,失敗返(fan)回 -1;
函數參數: 無
備注(zhu): getchar 函數實質是從標(biao)(biao)準(zhun)輸(shu)(shu)(shu)入(ru)設備緩(huan)沖(chong)區(qu)讀取(qu)一個(ge)字符(fu),用(yong)戶(hu)調用(yong) getchar 函數的時候,如(ru)果標(biao)(biao)準(zhun)輸(shu)(shu)(shu)入(ru)緩(huan)沖(chong)區(qu)沒有數據,則(ze)等(deng)待用(yong)戶(hu)從鍵盤輸(shu)(shu)(shu)入(ru);否(fou)則(ze),直接從標(biao)(biao)準(zhun)輸(shu)(shu)(shu)入(ru)緩(huan)沖(chong)區(qu)讀取(qu)一個(ge)字符(fu),而不等(deng)待用(yong)戶(hu)從鍵盤輸(shu)(shu)(shu)入(ru);請(qing)看下(xia)面的例(li)子:
int a = 0;
char b = 0;
scanf("%d", &a);
b=getchar();
在上面代碼(ma)中(zhong)(zhong),我(wo)們(men)首先調(diao)用 scanf 函數從鍵(jian)(jian)盤輸(shu)入一(yi)個整(zheng)(zheng)數到變(bian)(bian)量a中(zhong)(zhong),接(jie)著調(diao)用getchar函數從鍵(jian)(jian)盤輸(shu)入一(yi)個字符(fu)到變(bian)(bian)量b中(zhong)(zhong);但實際運行(xing)時(shi),我(wo)們(men)會發現(xian)輸(shu)入整(zheng)(zheng)數變(bian)(bian)量a后(hou),程(cheng)序并沒有停下來讓我(wo)們(men)輸(shu)入字符(fu)變(bian)(bian)量b,這(zhe)是因為我(wo)們(men)在輸(shu)入整(zheng)(zheng)形變(bian)(bian)量a后(hou),輸(shu)入緩沖區中(zhong)(zhong)保存了回(hui)車(che)符(fu),程(cheng)序在執行(xing)getchar函數時(shi),發現(xian)輸(shu)入緩沖區中(zhong)(zhong)有回(hui)車(che)符(fu),直接(jie)讀取了輸(shu)入緩沖區中(zhong)(zhong)的回(hui)車(che)符(fu),而不再等待用戶從鍵(jian)(jian)盤輸(shu)入.解(jie)決辦法是,在調(diao)用函數getchar輸(shu)入字符(fu)之前,先清空緩沖區,
如下所示:
int a = 0;
char b = 0;
scanf("%d", &a);
while(getchar()!='\n'); //清空輸(shu)入緩(huan)沖(chong)區(qu)
b=getchar();
上(shang)面程序(xu)中,在調用getchar()函數從(cong)鍵盤讀取(qu)字符之前(qian),先執行(xing)語句(ju)while(getchar()!='\n'); 清空輸入緩沖區.
用法舉例:
從標(biao)準(zhun)輸(shu)(shu)入(ru)設備輸(shu)(shu)入(ru)一(yi)個字(zi)符(fu)到字(zi)符(fu)變(bian)量 s 中
char s = 0;
s = getchar();
7 fgets 函數
函數原型: char *fgets(char *buf, int bufsize, FILE *stream);
功(gong)能: 從文件流stream中(zhong)讀取(qu)(qu)數(shu)據(ju),每(mei)次讀取(qu)(qu)一行(xing)。讀取(qu)(qu)的(de)數(shu)據(ju)保存在buf指向的(de)字符數(shu)組中(zhong)。
返回值(zhi): 函數執行(xing)成功(gong)返回buf
失敗(bai)或讀(du)到文件結尾返回NULL
函數參數:buf ,字符(fu)指針,用(yong)來存取(qu)所讀(du)取(qu)的(de)數據;
bufsize, 整數,buf緩沖區的大小;
stream, FILE指針(zhen),表示將要讀取的文件(jian)流;
備(bei)注:使(shi)用 fgets函(han)數(shu)讀(du)(du)取(qu)文件流(liu)數(shu)據的(de)時候(hou),每次多讀(du)(du)取(qu)bufsize-1個(ge)字(zi)符(fu)(fu)(第(di)bufsize個(ge)字(zi)符(fu)(fu)賦'\0'),如(ru)果文件中的(de)該(gai)(gai)行(xing),不足(zu)bufsize個(ge)字(zi)符(fu)(fu),則(ze)讀(du)(du)完該(gai)(gai)行(xing)就(jiu)結束。如(ru)若該(gai)(gai)行(xing)(包括后(hou)一(yi)個(ge)換行(xing)符(fu)(fu))的(de)字(zi)符(fu)(fu)數(shu)超過bufsize-1,則(ze)fgets只返回一(yi)個(ge)不完整的(de)行(xing),但是,緩(huan)沖區總(zong)是以(yi)NULL字(zi)符(fu)(fu)結尾,對fgets的(de)下一(yi)次調(diao)用會繼(ji)續(xu)讀(du)(du)該(gai)(gai)行(xing)。如(ru)果stream設置為(wei)標準輸入流(liu) stdin,則(ze)表示從標準輸入設備(bei)鍵盤(pan)讀(du)(du)取(qu)一(yi)行(xing)數(shu)據;
用法舉例:
從(cong)標準(zhun)輸(shu)入(ru)設備(bei)讀(du)取一(yi)行(xing)字(zi)符串到字(zi)符數組 str中
char str[100] = {0};
fgets(str,100,stdin);
printf("%s\n",str);
8 memset 函數
函數原型: void *memset(void *buffer, int ch, size_t count)
功(gong)能: 將(jiang)buffer中當前(qian)位(wei)置(zhi)后面的count個字節(jie)用 ch 替(ti)換
返回值: 返回 buffer
函數(shu)參數(shu): buffer 指針或數(shu)組(zu),內存緩(huan)沖區的(de)首地(di)址
ch 賦給(gei) buffer的值
count buffer的長度(du)
備注: memset函數(shu)按字(zi)節對內存塊進行(xing)初(chu)始化(hua),實際項目開發過程中,我們通常使(shi)用(yong)memset來對一塊內存進行(xing)清(qing)0或填充某一個特定的值;它是對較(jiao)大的結(jie)構體或數(shu)組進行(xing)清(qing)零操作的一種快方法。
用(yong)法(fa)舉例: 使用(yong)memset函數(shu)對(dui)數(shu)組(zu)清(qing)0
char strbuf[1000];
memset(strbuf,0,1000);
9 memcpy 函數
函數原型: void *memcpy(void *dest, const void *src, size_t n)
功(gong)能(neng): 由src指向地址為(wei)起(qi)始(shi)地址的連續n個字(zi)節的數(shu)據(ju)復制到以dest指向地址為(wei)起(qi)始(shi)地址的空間內。
返回(hui)值: 函(han)數返回(hui)一個指向dest的(de)指針
函數(shu)參(can)數(shu): dest 目(mu)標數(shu)據(ju)緩沖區起始地址(zhi)
src 源數據緩(huan)沖區起始(shi)地址
n 要復制(zhi)的字節數(shu)
備注: 由于函數(shu)拷貝的過程(cheng)是一個字(zi)節(jie)(jie)(jie)一個字(zi)節(jie)(jie)(jie)的拷貝的,所以實際操作的時(shi)候(hou)要(yao)把void*強制轉化為char*,這樣在指針加的時(shi)候(hou)才(cai)會保(bao)證每次加一個字(zi)節(jie)(jie)(jie).在實際項(xiang)目中(zhong),通常使用memcpy函數(shu)來給結構體變量賦值.
用法舉(ju)例(li): 使用memcpy函數將struct sockaddr_in 結構體變量 addr賦(fu)值給(gei)addrx
memcpy((char *)&addr,(char *)&addrx, sizeof(struct sockaddr_in))
以上就是今天我(wo)要給同學(xue)講解的常用C語言函數的使用,當(dang)然(ran)C語言的庫函數還(huan)有很多,這(zhe)里我(wo)們(men)(men)就不(bu)一一列舉了(le),希望對(dui)同學(xue)們(men)(men)能有所幫助。

