日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

C语言库函数相关

發(fā)布時間:2024/3/13 编程问答 29 豆豆
生活随笔 收集整理的這篇文章主要介紹了 C语言库函数相关 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

計算機考研機試筆記之C/C++基礎(chǔ)2

  • C語言庫函數(shù)
    • stdio.h
    • stdlib.h
    • string.h
    • math.h

參考書籍:
計算機考研復(fù)試上機指導(dǎo)全書.天勤計算機考研系列.孫肇博 張飛飛.2014.01

C語言庫函數(shù)

stdio.h

  • sscanf()
    從已知字符串buffer中獲取與指定格式相符的數(shù)據(jù),函數(shù)原型如下:int sscanf(const char *buffer, const char *format, ...); 示例:#include <stdio.h> int main() {char buf[] = "2019,w:c:b";int a;char b,c,d;sscanf(buf,"%d,%c:%c:%c",&a,&b,&c,&d);printf("%d_%c_%c_%c",a,b,c,d); return 0; } 輸出結(jié)果:2019_w_c_b 此函數(shù)可以用來將字符串類型表示的數(shù)據(jù),轉(zhuǎn)換為其他類型。
  • sprintf()
    將數(shù)據(jù)按照一定格式寫入字符串,函數(shù)原型如下:int sprintf(char *buffer, const char *format, ...); 示例:
    計算已知的兩小數(shù)之和,并將結(jié)果的第一位小數(shù)輸出#include <stdio.h> int main() {char buf[10];double a = 1.23456, b = 1.23456;sprintf(buf,"%f",a+b);int i = 0;while(buf[i++] != '.');printf("%s\n",buf);printf("%c",buf[i]);return 0; } 輸出結(jié)果:2.469120 4 此函數(shù)中的buffer,包含”\0“,因此在設(shè)置數(shù)組時,數(shù)組長度要加一。
  • ungetc()
    把字符 char(一個無符號字符)推入到指定的流 stream 中,使它成為下一個被讀取到的字符。函數(shù)原型如下:int ungetc(int char, FILE *stream); 示例:#include <stdio.h> int main() {char ch;int num;while((ch = getchar()) != '\n'){if(ch == ' ')//過濾空格continue;ungetc(ch,stdin);//將獲取的字符ch退回到stdin流 scanf("%d",&num);//從stdin中讀取數(shù)據(jù),以int類型存入num變量 printf("_%d_ ",num);}return 0; } 輸出結(jié)果:20 15 14 17 _20_ _15_ _14_ _17_ 該函數(shù)的作用,我比較認同以下這個說法:
    當從流中讀出字符,但不是所需內(nèi)容時,為了不改流的內(nèi)容,需要回寫入流中。寫回后再讀,仍會讀出來。1
    注意:
    ungetc 不能連續(xù)多次調(diào)用。兩次 ungetc 調(diào)用之間必須至少有一次讀操作或者文件指針移動操作(fseek,rewind 等 ) ,ungetc 只影響輸入流,而不影響與輸入流關(guān)聯(lián)的外存文件。
  • freopen()
    用于重定向輸入輸出流。該函數(shù)可以在不改變代碼原貌的情況下改變輸入輸出環(huán)境,但使用時應(yīng)當保證流是可靠的。函數(shù)原型如下:FILE *freopen(const char *fname, const char *mode, FILE *stream); 示例:#include <stdio.h> int main() {freopen("in.txt","r",stdin);//輸入重定向,輸入數(shù)據(jù)將從當前目錄下的in.txt文件中讀取 char ch;while((ch = getchar()) != EOF){printf("%c",ch);}fclose(stdin);//關(guān)閉重定向輸入return 0; } in.txt文件內(nèi)容:

    輸出結(jié)果:123456wertyui
  • stdlib.h

  • atof()
    把用字符串表示的浮點數(shù)(或整數(shù))轉(zhuǎn)換為double型的數(shù)據(jù)。函數(shù)原型如下:double atof(const char *str); 示例:#include <stdio.h> #include <stdlib.h> int main() {char *str1 = "11.62";char *str2 = "-11.62";char *str3 = "11.62e-2";char *str4 = "11.62abc1.26";char *str5 = "a11.62";double a,b,c,d,e;a = atof(str1);b = atof(str2);c = atof(str3);d = atof(str4);e = atof(str5);printf("%lf\n%lf\n%lf\n%lf\n%lf",a,b,c,d,e); return 0; } 輸出結(jié)果:11.620000 -11.620000 0.116200 11.620000 0.000000 注意:待轉(zhuǎn)換的字符串必須是有效的整數(shù)或浮點數(shù)(正負均可)開頭才能轉(zhuǎn)換成功。上例中str5不是以有效數(shù)字開頭,因此無法轉(zhuǎn)換。
  • malloc()和free()
    malloc()申請系統(tǒng)內(nèi)存空間,申請成功返回新開辟內(nèi)存空間的首地址,申請失敗返回NULL。
    free()釋放內(nèi)存空間。二者函數(shù)原型如下:void *malloc(size_t size); void free(void *ptr); 示例:#include <stdio.h> #include <stdlib.h> int main() {struct sqlist{int data;struct sqlist *next;};sqlist *p;p = (sqlist *)malloc(sizeof(sqlist));//對返回值一定要進行強制類型轉(zhuǎn)換,函數(shù)參數(shù)為申請的內(nèi)存空間大小//做一些操作……free(p);return 0; }
  • qsort()
    快速排序,后面提及排序時具體講解。
  • string.h

  • strlen()
    獲取字符串長度,不包括”\0“。

    unsigned int strlen(char *str);

    示例:

    #include <stdio.h> #include <string.h> int main() {char c[] = "welcome";printf("%d",strlen(c));return 0; }

    輸出結(jié)果:

    7

    注:strlen()是一個函數(shù),需要進行函數(shù)調(diào)用;而sizeof()是單目運算符,在編譯時計算緩沖區(qū)的長度,因此 sizeof ()不能用來返回動態(tài)分配的內(nèi)存空間的大小

    實現(xiàn)strlen()函數(shù)功能:見”C語言:三種方法模擬實現(xiàn)strlen函數(shù)“2

  • strcmp()
    從左往右比較str1str2兩個字符串對應(yīng)位置的ASCII碼值的大小。當值不同時,或遇到結(jié)束符時,返回結(jié)果。當str1 < str2時,返回負數(shù);當str1 = str2時,返回0;當str1 > str2時,返回正數(shù)。只能用于字符串的比較,不能用于各種類型的數(shù)組比較,函數(shù)原型如下:

    int strcmp(const char *str1, const char *str2);

    示例:

    #include <stdio.h> #include <string.h> int main() {char *a = "acm";char *b = "block";char *c = "code";printf("%d\n",strcmp(c,b)); printf("%d\n",strcmp(a,a));printf("%d",strcmp(a,c)); return 0; }

    輸出結(jié)果:

    1 0 -1

    一種實現(xiàn)strcmp()函數(shù)功能的函數(shù):

    #include <stdio.h> int strcmp_self(const char *str1, const char *str2){//函數(shù)傳入?yún)?shù)為const char* ,屬于有符號數(shù) while(*str1 && *str2 && (*str1 == *str2)){str1++;str2++;}if(*(unsigned char *)str1 > *(unsigned char *)str2)//由于該函數(shù)參數(shù)為有符號數(shù),但字符串的ASCII碼無負值//若不轉(zhuǎn)換,比較的時候會出現(xiàn)錯誤 //因此要使用unsigned char*強制轉(zhuǎn)換為無符號數(shù) return 1;else if(*(unsigned char *)str1 < *(unsigned char *)str2)return -1;elsereturn 0; } int main() {char *a = "acm";char *b = "block";char *c = "code";printf("%d\n",strcmp_self(c,b)); printf("%d\n",strcmp_self(a,a));printf("%d",strcmp_self(a,c)); return 0;return 0; }

    運行結(jié)果同上。

  • strcpy()
    將以from為首地址的字符串連同’\0’,復(fù)制到以to為首地址的存儲空間,只能拷貝字符串,不能用于各種類型的數(shù)組復(fù)制,原型如下:

    char *strcpy(char *to, const char *from);

    函數(shù)實現(xiàn):

    #include <stdio.h> #include <assert.h> char *strcpy_self(char *to, const char *from){assert((to != NULL) && (from != NULL));char *ret = to;while((*ret++ = *from++) != '\0');return to; } int main() {char a[6] = "good";char b[6] = "bad";//此處未使用指針形式,大家也請注意//通過char *指針修改字符串常量中的字符會導(dǎo)致Segment fault錯誤//原因是char *a = "good",good的存儲位置是只讀的內(nèi)存地址//不允許執(zhí)行以下的strcpy()操作printf("%s\t%s\n",a,b);strcpy_self(a,b);printf("%s\t%s\t",a,b);return 0; }

    輸出結(jié)果:

    good bad bad bad

    與strcpy()相似的有一個strncpy()的函數(shù),該函數(shù)功能類似,只不過strncpy拷貝的是字符,最后一個’\0’沒有拷貝,所以拷貝的時候需要對串進行清零處理,在最后加‘\0’,一定要養(yǎng)成好習(xí)慣。同時,使用strncpy()時,一定要防止內(nèi)存重疊。其實現(xiàn)如下,將以src為首地址的字符串中的前n個字符拷貝到dest所指的數(shù)組中,并返回數(shù)組首地址:

    #include <stdio.h> #include <assert.h> char *strncpy_self(char *dest,const char *src,int n) {assert((dest!=NULL)&&(src!=NULL));char *cp=dest;while(n&&(*cp++=*src++)!='\0'){n--;}if(n){while(--n)*cp++='\0';}return dest; } int main() {char a[6] = "good";char b[6] = "bad";printf("%s\t%s\n",a,b);strncpy_self(a,b,2);printf("%s\t%s\t",a,b);return 0; }
  • strcat()
    將以str2為首地址的字符串(包括’\0’)追加到以str1為首地址的字符串后面(刪除*str1后面的’\0’),其函數(shù)原型如下:

    char *strcat(char *str1,const char *str2);

    我一般不使用strcat(),容易把自己搞糊涂,弄不清楚字符串內(nèi)容最終成為了什么,或者造成內(nèi)存溢出等錯誤,故習(xí)慣直接在主函數(shù)中寫一遍:

    #include <cstdio> int main() {char a[15] = "good";char b[15] = "bad";printf("%s\t%s\n",a,b);//函數(shù)實現(xiàn)將字符數(shù)組 b 的內(nèi)容追加到字符數(shù)組 a//數(shù)組 a 一定要足夠大,足以放下追加的內(nèi)容int i = 0, j = 0;while(a[i++]);i--;while(b[j]){a[i++] = b[j++];}a[i] = '\0';//補充結(jié)束符printf("%s\t%s\t",a,b);return 0; }

    輸出結(jié)果:

    good bad goodbad bad```
  • strstr()
    判斷字符串*str2是否是*str1的子串,返回一個指針,指向字符串*str2在字符串*str1中出現(xiàn)的首位置,否則返回NULL。函數(shù)原型如下:

    const char *strstr(const char *str1,const char *str2);

    函數(shù)實現(xiàn):

    #include <stdio.h> #include <assert.h> const char *strstr_self(const char *str1,const char *str2){const char *p1;const char *p2;if(!str1 || !str2){return NULL;}//遍歷str1字符串while(*str1){//遍歷子串p1 = str1;p2 = str2;do{if(!*p2) //到了str2的結(jié)束位置,返回str1的位置return str1;}while(*p1++ == *p2++);str1++;}return NULL; } int main() {char a[15] = "good";char b[15] = "ood";printf("%s\t%s\n",a,b);const char *c = strstr_self(a,b);printf("%s",c);return 0; }
  • strtok()
    用*str2中字符將*str1字符串分割,返回指針,指向分割下來的字符串首地址,若無分割下來的字符串,返回NULL。函數(shù)原型如下:

    char *strtok(char *str1,const char *str2);

    示例:

    #include <stdio.h> #include <string.h> int main() {char a[] = "see you tomorrow";char b[] = " ";printf("%s\t%s\n",a,b);char *res = NULL;res = strtok(a,b);while(res != NULL){//注意,第一次調(diào)用strtok()函數(shù)時,第一個參數(shù)時str1//但是之后調(diào)用時,第一個參數(shù)要改為NULL printf("%s\n",res);res = strtok(NULL,b);}return 0; }

    輸出結(jié)果:

    see you tomorrow see you tomorrow
  • memset()
    將一段內(nèi)存置為某個值,**常用!**函數(shù)原型為:

    void *memset(void *buffer, int ch, size_t count);

    示例:

    #include <stdio.h> #include <string.h> int main() {char a[] = "see you tomorrow";printf("%s\n",a);memset(a,'b',6); //將字符串數(shù)組 a 的前6個字符置為字符'b' printf("%s\n",a);return 0; }

    輸出結(jié)果:

    see you tomorrow bbbbbbu tomorrow
  • math.h

    見下篇


  • https://blog.csdn.net/hubi0952/article/details/6897503 ??

  • https://blog.csdn.net/windyj809/article/details/80037006 ??

  • 總結(jié)

    以上是生活随笔為你收集整理的C语言库函数相关的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。