實(shí)際項(xiàng)目開發(fā)過程中常用C語(yǔ)言函數(shù)的用法
C語(yǔ)言是當(dāng)中最廣泛的計(jì)算機(jī)編程語(yǔ)言,是所有計(jì)算機(jī)編程語(yǔ)言的祖先,其他計(jì)算機(jī)編程語(yǔ)言包括當(dāng)前流行的Java語(yǔ)言,都是用C語(yǔ)言實(shí)現(xiàn)的,C語(yǔ)言是編程效率最高的計(jì)算機(jī)語(yǔ)言,既能完成上層應(yīng)用開發(fā),也能完成底層硬件驅(qū)動(dòng)編程,在計(jì)算機(jī)程序設(shè)計(jì)當(dāng)中,特別是在底層硬件驅(qū)動(dòng)開發(fā)當(dāng)中,具有不可替代的作用。在C語(yǔ)言學(xué)習(xí)過程當(dāng)中,除了學(xué)習(xí)好C語(yǔ)言基本語(yǔ)法外,掌握常用的C語(yǔ)言庫(kù)函數(shù)的使用也是非常重要的,本文主要給同學(xué)們?cè)敿?xì)講解在實(shí)際項(xiàng)目開發(fā)過程中常用C語(yǔ)言函數(shù)的用法。
1 printf 函數(shù)
函數(shù)原型:int printf(const char *format,[argument]);
功能:實(shí)現(xiàn)格式化輸入輸出
返回值:實(shí)際輸出的字符個(gè)數(shù)
函數(shù)參數(shù):format 格式化字符串
argument 要輸出的參數(shù)
常用的格式化類型有:
d 有符號(hào)10進(jìn)制整數(shù)
o 無符號(hào)8進(jìn)制整數(shù)
u 無符號(hào)10進(jìn)制整數(shù)
x 無符號(hào)的16進(jìn)制數(shù)字,并以小寫abcdef表示
X 無符號(hào)的16進(jìn)制數(shù)字,并以大寫ABCDEF表示
f 浮點(diǎn)數(shù)
c 單個(gè)字符
s 字符串
p 顯示一個(gè)指針,near指針表示為:XXXX,far指針表示為:XXXX:YYYY
用法舉例:
以10進(jìn)制形式輸出整形變量a的值;
int a = 100;
printf("a=%d\n", a);
上面程序的執(zhí)行結(jié)果為:在屏幕終端輸出 a=100
2 fprintf函數(shù)
函數(shù)原型:int fprintf (FILE* stream, const char*format, [argument])
功能:將按照格式化字符串格式化后的數(shù)據(jù)輸出到文件流stream中,
返回值:實(shí)際寫入到文件的字符個(gè)數(shù)
函數(shù)參數(shù):stream 要輸出的文件流指針
format 格式化字符串
argument 要輸出的參數(shù)
備注:fprintf和printf函數(shù)非常類似,使用方法也相同,它們不同之處在于printf函數(shù)是輸出結(jié)果到標(biāo)準(zhǔn)輸出終端,一般為屏幕,而fprintf是將結(jié)果輸出到指定的文件流;如果將參數(shù)輸出文件流stream設(shè)置為標(biāo)準(zhǔn)輸出流stdout,則與printf函數(shù)等效,如下所示:
fprintf (stdout, const char*format, [argument])
用法舉例:
例如:將一個(gè)格式化字符串寫入到文件file1.txt中
FILE *fp = fopen("file1.txt","wb");
int count = 190;
fprintf(fp,"hello :%d\n", count);
上面程序的執(zhí)行結(jié)果為往file1.txt文件中寫入 "hello :190" 字符串.
3 sprintf 函數(shù)
函數(shù)原型:int sprintf (char* buffer, const char*format, [argument])
功能:將按照格式化字符串格式化后的數(shù)據(jù)輸出到字符串buffer中
返回值:實(shí)際輸出到字符串buffer的字符個(gè)數(shù)
函數(shù)參數(shù):buffer 要輸出的字符串指針
format 格式化字符串
argument 要輸出的參數(shù)
備注:sprintf和printf函數(shù)非常類似,使用方法也相同,它們不同之處在于printf函數(shù)是輸出結(jié)果到標(biāo)準(zhǔn)輸出終端,一般為屏幕,而sprintf是將結(jié)果輸出到指定的字符串buffer;
用法舉例:
將一個(gè)格式化字符串寫入到目標(biāo)字符串buffer中
char buffer[50] = {0};
int count = 190;
fprintf(buffer,"hello :%d\n", count);
上面程序執(zhí)行后,buffer中保存字符串 "hello :190"
4 scanf 函數(shù)
函數(shù)原型:int scanf(char *format [,argument,...])
功能:從標(biāo)準(zhǔn)輸入設(shè)備(一般指鍵盤)實(shí)現(xiàn)格式化輸入
返回值:成功返回讀入的數(shù)據(jù)項(xiàng)個(gè)數(shù)
函數(shù)參數(shù):format 格式化字符串
argument 輸入數(shù)據(jù)項(xiàng)的地址列表
常用格式類型參考printf函數(shù)的個(gè)格式類型
用法舉例:
從標(biāo)準(zhǔn)輸入設(shè)備中輸入一個(gè)整數(shù)到整形變量a中,輸入一個(gè)浮點(diǎn)數(shù)到浮點(diǎn)型變量b中
int a=0;
float b=0;
scanf("%d%f",&a,&b);
上面程序執(zhí)行后,從鍵盤輸入: 19 18.6 ,程序?qū)?19賦值給變量a, 18.6賦值給變量b .
備注: scanf 函數(shù)格式化字符串中不能加 \n,如上例中這樣寫 scanf("%d%f\n",&a,%b) 是錯(cuò)誤的。
5 sscanf 函數(shù)
函數(shù)原型:int sscanf(const char *buffer, char *format [,argument,...])
功能:讀取格式化字符串中的位置
返回值:成功返回讀入的數(shù)據(jù)項(xiàng)個(gè)數(shù)
函數(shù)參數(shù):buffer 要讀取的格式化字符串
format 格式化字符串
argument 輸入數(shù)據(jù)項(xiàng)的地址列表
備注: sscanf函數(shù)的使用和scanf函數(shù)非常類似,它們之間的區(qū)別在于 scanf函數(shù)是從標(biāo)準(zhǔn)輸入設(shè)備輸入,而sscanf 是從指定的字符串輸入;
用法舉例:
通常使用sscanf函數(shù)類實(shí)現(xiàn)數(shù)據(jù)類型轉(zhuǎn)換,將字符串轉(zhuǎn)換為整形或浮點(diǎn)型數(shù)據(jù),舉例如下:
char str[]="0x1a";
int b=0;
sscanf(str,"0x%x",&b);
上面程序的執(zhí)行結(jié)果將字符串0x1a 轉(zhuǎn)換成對(duì)應(yīng)的16進(jìn)制值保存到變量b中 .
6 getchar 函數(shù)
函數(shù)原型: int getchar(void)
功能: getchar 函數(shù)的功能是從標(biāo)準(zhǔn)輸入設(shè)備讀取下一個(gè)字符,包括回車換行符都能讀取
返回值: 成功返回用戶輸入字符對(duì)應(yīng)的ASCII碼,失敗返回 -1;
函數(shù)參數(shù): 無
備注: getchar 函數(shù)實(shí)質(zhì)是從標(biāo)準(zhǔn)輸入設(shè)備緩沖區(qū)讀取一個(gè)字符,用戶調(diào)用 getchar 函數(shù)的時(shí)候,如果標(biāo)準(zhǔn)輸入緩沖區(qū)沒有數(shù)據(jù),則等待用戶從鍵盤輸入;否則,直接從標(biāo)準(zhǔn)輸入緩沖區(qū)讀取一個(gè)字符,而不等待用戶從鍵盤輸入;請(qǐng)看下面的例子:
int a = 0;
char b = 0;
scanf("%d", &a);
b=getchar();
在上面代碼中,我們首先調(diào)用 scanf 函數(shù)從鍵盤輸入一個(gè)整數(shù)到變量a中,接著調(diào)用getchar函數(shù)從鍵盤輸入一個(gè)字符到變量b中;但實(shí)際運(yùn)行時(shí),我們會(huì)發(fā)現(xiàn)輸入整數(shù)變量a后,程序并沒有停下來讓我們輸入字符變量b,這是因?yàn)槲覀冊(cè)谳斎胝巫兞縜后,輸入緩沖區(qū)中保存了回車符,程序在執(zhí)行g(shù)etchar函數(shù)時(shí),發(fā)現(xiàn)輸入緩沖區(qū)中有回車符,直接讀取了輸入緩沖區(qū)中的回車符,而不再等待用戶從鍵盤輸入.解決辦法是,在調(diào)用函數(shù)getchar輸入字符之前,先清空緩沖區(qū),
如下所示:
int a = 0;
char b = 0;
scanf("%d", &a);
while(getchar()!='\n'); //清空輸入緩沖區(qū)
b=getchar();
上面程序中,在調(diào)用getchar()函數(shù)從鍵盤讀取字符之前,先執(zhí)行語(yǔ)句while(getchar()!='\n'); 清空輸入緩沖區(qū).
用法舉例:
從標(biāo)準(zhǔn)輸入設(shè)備輸入一個(gè)字符到字符變量 s 中
char s = 0;
s = getchar();
7 fgets 函數(shù)
函數(shù)原型: char *fgets(char *buf, int bufsize, FILE *stream);
功能: 從文件流stream中讀取數(shù)據(jù),每次讀取一行。讀取的數(shù)據(jù)保存在buf指向的字符數(shù)組中。
返回值: 函數(shù)執(zhí)行成功返回buf
失敗或讀到文件結(jié)尾返回NULL
函數(shù)參數(shù):buf ,字符指針,用來存取所讀取的數(shù)據(jù);
bufsize, 整數(shù),buf緩沖區(qū)的大小;
stream, FILE指針,表示將要讀取的文件流;
備注:使用 fgets函數(shù)讀取文件流數(shù)據(jù)的時(shí)候,每次最多讀取bufsize-1個(gè)字符(第bufsize個(gè)字符賦'\0'),如果文件中的該行,不足bufsize個(gè)字符,則讀完該行就結(jié)束。如若該行(包括最后一個(gè)換行符)的字符數(shù)超過bufsize-1,則fgets只返回一個(gè)不完整的行,但是,緩沖區(qū)總是以NULL字符結(jié)尾,對(duì)fgets的下一次調(diào)用會(huì)繼續(xù)讀該行。如果stream設(shè)置為標(biāo)準(zhǔn)輸入流 stdin,則表示從標(biāo)準(zhǔn)輸入設(shè)備鍵盤讀取一行數(shù)據(jù);
用法舉例:
從標(biāo)準(zhǔn)輸入設(shè)備讀取一行字符串到字符數(shù)組 str中
char str[100] = {0};
fgets(str,100,stdin);
printf("%s\n",str);
8 memset 函數(shù)
函數(shù)原型: void *memset(void *buffer, int ch, size_t count)
功能: 將buffer中當(dāng)前位置后面的count個(gè)字節(jié)用 ch 替換
返回值: 返回 buffer
函數(shù)參數(shù): buffer 指針或數(shù)組,內(nèi)存緩沖區(qū)的首地址
ch 賦給 buffer的值
count buffer的長(zhǎng)度
備注: memset函數(shù)按字節(jié)對(duì)內(nèi)存塊進(jìn)行初始化,實(shí)際項(xiàng)目開發(fā)過程中,我們通常使用memset來對(duì)一塊內(nèi)存進(jìn)行清0或填充某一個(gè)特定的值;它是對(duì)較大的結(jié)構(gòu)體或數(shù)組進(jìn)行清零操作的一種最快方法。
用法舉例: 使用memset函數(shù)對(duì)數(shù)組清0
char strbuf[1000];
memset(strbuf,0,1000);
9 memcpy 函數(shù)
函數(shù)原型: void *memcpy(void *dest, const void *src, size_t n)
功能: 由src指向地址為起始地址的連續(xù)n個(gè)字節(jié)的數(shù)據(jù)復(fù)制到以dest指向地址為起始地址的空間內(nèi)。
返回值: 函數(shù)返回一個(gè)指向dest的指針
函數(shù)參數(shù): dest 目標(biāo)數(shù)據(jù)緩沖區(qū)起始地址
src 源數(shù)據(jù)緩沖區(qū)起始地址
n 要復(fù)制的字節(jié)數(shù)
備注: 由于函數(shù)拷貝的過程是一個(gè)字節(jié)一個(gè)字節(jié)的拷貝的,所以實(shí)際操作的時(shí)候要把void*強(qiáng)制轉(zhuǎn)化為char*,這樣在指針加的時(shí)候才會(huì)保證每次加一個(gè)字節(jié).在實(shí)際項(xiàng)目中,通常使用memcpy函數(shù)來給結(jié)構(gòu)體變量賦值.
用法舉例: 使用memcpy函數(shù)將struct sockaddr_in 結(jié)構(gòu)體變量 addr賦值給addrx
memcpy((char *)&addr,(char *)&addrx, sizeof(struct sockaddr_in))
以上就是今天我要給同學(xué)講解的常用C語(yǔ)言函數(shù)的使用,當(dāng)然C語(yǔ)言的庫(kù)函數(shù)還有很多,這里我們就不一一列舉了,希望對(duì)同學(xué)們能有所幫助。
- 贊