C语言库函数相关
計算機考研機試筆記之C/C++基礎(chǔ)2
- C語言庫函數(shù)
- stdio.h
- stdlib.h
- string.h
- math.h
參考書籍:
計算機考研復(fù)試上機指導(dǎo)全書.天勤計算機考研系列.孫肇博 張飛飛.2014.01
C語言庫函數(shù)
stdio.h
從已知字符串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)換為其他類型。
將數(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ù)組長度要加一。
把字符 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ù)的作用,我比較認(rèn)同以下這個說法:
當(dāng)從流中讀出字符,但不是所需內(nèi)容時,為了不改流的內(nèi)容,需要回寫入流中。寫回后再讀,仍會讀出來。1
注意:
ungetc 不能連續(xù)多次調(diào)用。兩次 ungetc 調(diào)用之間必須至少有一次讀操作或者文件指針移動操作(fseek,rewind 等 ) ,ungetc 只影響輸入流,而不影響與輸入流關(guān)聯(lián)的外存文件。
用于重定向輸入輸出流。該函數(shù)可以在不改變代碼原貌的情況下改變輸入輸出環(huán)境,但使用時應(yīng)當(dāng)保證流是可靠的。函數(shù)原型如下:FILE *freopen(const char *fname, const char *mode, FILE *stream); 示例:#include <stdio.h> int main() {freopen("in.txt","r",stdin);//輸入重定向,輸入數(shù)據(jù)將從當(dāng)前目錄下的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
把用字符串表示的浮點數(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ù)(正負(fù)均可)開頭才能轉(zhuǎn)換成功。上例中str5不是以有效數(shù)字開頭,因此無法轉(zhuǎn)換。
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));//對返回值一定要進(jìn)行強制類型轉(zhuǎn)換,函數(shù)參數(shù)為申請的內(nèi)存空間大小//做一些操作……free(p);return 0; }
快速排序,后面提及排序時具體講解。
string.h
strlen()
獲取字符串長度,不包括”\0“。
示例:
#include <stdio.h> #include <string.h> int main() {char c[] = "welcome";printf("%d",strlen(c));return 0; }輸出結(jié)果:
7注:strlen()是一個函數(shù),需要進(jìn)行函數(shù)調(diào)用;而sizeof()是單目運算符,在編譯時計算緩沖區(qū)的長度,因此 sizeof ()不能用來返回動態(tài)分配的內(nèi)存空間的大小。
實現(xiàn)strlen()函數(shù)功能:見”C語言:三種方法模擬實現(xiàn)strlen函數(shù)“2
strcmp()
從左往右比較str1和str2兩個字符串對應(yīng)位置的ASCII碼值的大小。當(dāng)值不同時,或遇到結(jié)束符時,返回結(jié)果。當(dāng)str1 < str2時,返回負(fù)數(shù);當(dāng)str1 = str2時,返回0;當(dāng)str1 > str2時,返回正數(shù)。只能用于字符串的比較,不能用于各種類型的數(shù)組比較,函數(shù)原型如下:
示例:
#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碼無負(fù)值//若不轉(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ù)制,原型如下:
函數(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’沒有拷貝,所以拷貝的時候需要對串進(jìn)行清零處理,在最后加‘\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ù)原型如下:
我一般不使用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ù)原型如下:
函數(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ù)原型如下:
示例:
#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 tomorrowmemset()
將一段內(nèi)存置為某個值,**常用!**函數(shù)原型為:
示例:
#include <stdio.h> #include <string.h> int main() {char a[] = "see you tomorrow";printf("%s\n",a);memset(a,'b',6); //將字符串?dāng)?shù)組 a 的前6個字符置為字符'b' printf("%s\n",a);return 0; }輸出結(jié)果:
see you tomorrow bbbbbbu tomorrowmath.h
見下篇
https://blog.csdn.net/hubi0952/article/details/6897503 ??
https://blog.csdn.net/windyj809/article/details/80037006 ??
總結(jié)
- 上一篇: Java将一张图片放在另一张图片上(位置
- 下一篇: monit 内存 监控_mac系统监控软