要模擬庫(kù)函數(shù)的實(shí)現(xiàn),必須要搞清楚的是在程序調(diào)用中它的實(shí)現(xiàn)原理是什么,接下來就講解幾個(gè)字符串相關(guān)的函數(shù),比如strcmp(),strncmp(),strcat(),strncat()......
我們提供的服務(wù)有:網(wǎng)站建設(shè)、成都網(wǎng)站制作、微信公眾號(hào)開發(fā)、網(wǎng)站優(yōu)化、網(wǎng)站認(rèn)證、紅花崗ssl等。為上千家企事業(yè)單位解決了網(wǎng)站和推廣的問題。提供周到的售前咨詢和貼心的售后服務(wù),是有科學(xué)管理、有技術(shù)的紅花崗網(wǎng)站制作公司字符串函數(shù)主要包括受限制字符串函數(shù)與不受限制字符串函數(shù),那么什么是受限制字符串函數(shù)與不受限制字符串函數(shù)呢?!簡(jiǎn)單來講,不受限制字符串函數(shù)就是使用這些函數(shù)時(shí),它們只是通過字符串結(jié)尾的NULL 字符來確定字符串的長(zhǎng)度,例如我們常用的strcmp(),strcpy();而受限制的字符串函數(shù)就是這些函數(shù)她們接受一個(gè)顯示的長(zhǎng)度參數(shù),來限定要復(fù)制或者比較的字符個(gè)數(shù),例如strncmp(),strncpy(),這里邊的n在函數(shù)名和函數(shù)傳參中都有,n即為要操作的字符個(gè)數(shù)。
一、不受限制字符串函數(shù)
1.strcpy()
庫(kù)函數(shù)原型:char*strcpy(char*strDestination,constchar*strSource);
實(shí)現(xiàn):將拷貝的字符串str2一個(gè)一個(gè)拷貝到字符數(shù)組str1中,直到字符數(shù)組遇到‘\0’結(jié)束標(biāo)志后拷貝完成。在拷貝時(shí),str2中的'\0'一同被拷貝。
char *my_strcpy(char *str1,const char *str2) { char *start = str1; //保存字符數(shù)組2的首地址 assert(str1); assert(str2); while(*str1++ = *str2++) { ; } return start; }
2.strlen()
庫(kù)函數(shù)原型:size_tstrlen(constchar*string);
實(shí)現(xiàn):在遇到'\0'之前,指針每向后挪動(dòng)一次,計(jì)數(shù)器加一次
int my_strlen(const char *str1) { int count = 0; assert(str1); while(*str1++) { count++; //str1++; } return count; }
3.strcmp()
庫(kù)函數(shù)原型:intstrcmp(constchar*string1,constchar*string2);
比較規(guī)則:兩個(gè)字符串自左向右逐個(gè)字符比較(按ASCII碼的值比較),知道出現(xiàn)不同的字符或者遇到‘\0’。
(1)如果字符全部相等,則兩個(gè)字符串相等;
(2)如果出現(xiàn)不同的字符,則以第一對(duì)不相同字符的比較結(jié)果為準(zhǔn)。
比較的結(jié)果由函數(shù)值帶回:
(1)字符串1 = 字符串2,返回0;
(2)字符串1 > 字符串2 ,返回一個(gè)正整數(shù);
(3)字符串1 < 字符串2,返回一個(gè)負(fù)整數(shù)。
int my_strcmp(const char *str1,const char *str2) { assert(str1); assert(str2); while(*str1 == *str2) { if(*str1 != '\0') return 0; str1++; str2++; } return *str1 - *str2; }
4.strcat()
庫(kù)函數(shù)原型:char*strcat(char*strDestination,constchar*strSource);
實(shí)現(xiàn):指針指到字符數(shù)組1 的結(jié)尾時(shí),將字符串2 中的字符一個(gè)一個(gè)追加到字符數(shù)組1 的后面,指針向后挪一次,字符拷貝一個(gè),直到字符數(shù)組1 遇到‘\0’時(shí)追加完畢。(字符數(shù)組1 要足夠大,能把字符串2 都添加進(jìn)去)
char *my_strcat(char *str1,const char *str2) { char *start = str1; //保存字符數(shù)組的首地址 assert(str1); assert(str2); while(*str1) { str1++; } while(*str2) { *str1 = *str2; str1++; str2++; } *str1 = '\0'; return start; }
5.strstr()
庫(kù)函數(shù)原型:char*strstr(constchar*string,constchar*strCharSet);
實(shí)現(xiàn):在字符串str1 中找子字符串str2,如果能找到,就返回子串的起始位置,如果找不到,就返回NULL
char *my_strstr(const char *str, const char *substr) { const char *str1 = str; const char *str2 = substr; const char *start = NULL; assert(str); assert(substr); if(*str2 == '\0') return (char *)str1; while(*str1) { start = str1; //找到的第一個(gè)字符保存 while(*str1 && *str2 && *str1 == *str2) { str1++; str2++; } if(*str2 == '\0') return (char *)start; str1 = start + 1; str2 = substr; } return NULL; }
二、受限制字符串函數(shù)
1.strncat()
原型:char*strncat(char*strDest,constchar*strSource,size_tcount);
count為要追加的字符個(gè)數(shù)
char *my_strncat(char *str1,char *str2,size_t n) { char *start = str1; //保存字符數(shù)組1 的起始地址 assert(str1); assert(str2); while(*str1) { str1++; } while(n) { *str1 = *str2; str1++; str2++; n--; } *str1 = '\0'; return start; }
2.strncmp()
函數(shù)原型:char*strncpy(char*strDest,constchar*strSource,size_tcount);
int my_strncmp(const char *str1,const char *str2,size_t n) { assert(str1); assert(str2); while(n && *str1 && *str1 == *str2) { if(*str1 != '\0') return 0; str1++; str2++; n--; } return *str1 - *str2; }
3.strncpy()
庫(kù)函數(shù)原型:char*strncpy(char*strDest,constchar*strSource,size_tcount);
char *my_strncpy(char *str1,char *str2,size_t n) { char *start = str1; assert(str1); assert(str2); while((n--) && (*str1++ = *str2++)) { //*str1++ = *str2++; //n--; } *str1 = '\0'; return start; }
創(chuàng)新互聯(lián)www.cdcxhl.cn,專業(yè)提供香港、美國(guó)云服務(wù)器,動(dòng)態(tài)BGP最優(yōu)骨干路由自動(dòng)選擇,持續(xù)穩(wěn)定高效的網(wǎng)絡(luò)助力業(yè)務(wù)部署。公司持有工信部辦法的idc、isp許可證, 機(jī)房獨(dú)有T級(jí)流量清洗系統(tǒng)配攻擊溯源,準(zhǔn)確進(jìn)行流量調(diào)度,確保服務(wù)器高可用性。佳節(jié)活動(dòng)現(xiàn)已開啟,新人活動(dòng)云服務(wù)器買多久送多久。