您好,登錄后才能下訂單哦!
要模擬庫函數的實現,必須要搞清楚的是在程序調用中它的實現原理是什么,接下來就講解幾個字符串相關的函數,比如strcmp(),strncmp(),strcat(),strncat()......
字符串函數主要包括受限制字符串函數與不受限制字符串函數,那么什么是受限制字符串函數與不受限制字符串函數呢?!簡單來講,不受限制字符串函數就是使用這些函數時,它們只是通過字符串結尾的NULL 字符來確定字符串的長度,例如我們常用的strcmp(),strcpy();而受限制的字符串函數就是這些函數她們接受一個顯示的長度參數,來限定要復制或者比較的字符個數,例如strncmp(),strncpy(),這里邊的n在函數名和函數傳參中都有,n即為要操作的字符個數。
一、不受限制字符串函數
1.strcpy()
庫函數原型:char *strcpy( char *strDestination, const char *strSource );
實現:將拷貝的字符串str2一個一個拷貝到字符數組str1中,直到字符數組遇到‘\0’結束標志后拷貝完成。在拷貝時,str2中的'\0'一同被拷貝。
char *my_strcpy(char *str1,const char *str2) { char *start = str1; //保存字符數組2的首地址 assert(str1); assert(str2); while(*str1++ = *str2++) { ; } return start; }
2.strlen()
庫函數原型:size_t strlen( const char *string );
實現:在遇到'\0'之前,指針每向后挪動一次,計數器加一次
int my_strlen(const char *str1) { int count = 0; assert(str1); while(*str1++) { count++; //str1++; } return count; }
3.strcmp()
庫函數原型:int strcmp( const char *string1, const char *string2 );
比較規則:兩個字符串自左向右逐個字符比較(按ASCII碼的值比較),知道出現不同的字符或者遇到‘\0’。
(1)如果字符全部相等,則兩個字符串相等;
(2)如果出現不同的字符,則以第一對不相同字符的比較結果為準。
比較的結果由函數值帶回:
(1)字符串1 = 字符串2,返回0;
(2)字符串1 > 字符串2 ,返回一個正整數;
(3)字符串1 < 字符串2,返回一個負整數。
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()
庫函數原型:char *strcat( char *strDestination, const char *strSource );
實現:指針指到字符數組1 的結尾時,將字符串2 中的字符一個一個追加到字符數組1 的后面,指針向后挪一次,字符拷貝一個,直到字符數組1 遇到‘\0’時追加完畢。(字符數組1 要足夠大,能把字符串2 都添加進去)
char *my_strcat(char *str1,const char *str2) { char *start = str1; //保存字符數組的首地址 assert(str1); assert(str2); while(*str1) { str1++; } while(*str2) { *str1 = *str2; str1++; str2++; } *str1 = '\0'; return start; }
5.strstr()
庫函數原型:char *strstr( const char *string, const char *strCharSet );
實現:在字符串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; //找到的第一個字符保存 while(*str1 && *str2 && *str1 == *str2) { str1++; str2++; } if(*str2 == '\0') return (char *)start; str1 = start + 1; str2 = substr; } return NULL; }
二、受限制字符串函數
1.strncat()
原型:char *strncat( char *strDest, const char *strSource, size_t count );
count為要追加的字符個數
char *my_strncat(char *str1,char *str2,size_t n) { char *start = str1; //保存字符數組1 的起始地址 assert(str1); assert(str2); while(*str1) { str1++; } while(n) { *str1 = *str2; str1++; str2++; n--; } *str1 = '\0'; return start; }
2.strncmp()
函數原型:char *strncpy( char *strDest, const char *strSource, size_t count );
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()
庫函數原型:char *strncpy( char *strDest, const char *strSource, size_t count );
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; }
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。