C語言字符函數(shù)、內(nèi)存函數(shù)功能及實現(xiàn)代碼
C語言字符函數(shù)、內(nèi)存函數(shù) 功能及實現(xiàn) strlen函數(shù)(求字符串長度)注意點模擬實現(xiàn) strcpy函數(shù)(字符串拷貝函數(shù))注意點模擬實現(xiàn) strcat函數(shù)(字符串銜接函數(shù))注意點模擬實現(xiàn) strcmp函數(shù)注意點模擬實現(xiàn) strstr函數(shù)模擬實現(xiàn) strtok函數(shù)使用 strerror函數(shù)使用 memcpy函數(shù)注意點模擬實現(xiàn) memmove函數(shù)注意點模擬實現(xiàn) memset函數(shù)注意點
strlen函數(shù)(求字符串長度)
統(tǒng)計字符串長度直到\0為止
注意點
1、屬于<string.h>庫
2、參數(shù)為字符串,返回類型為無符號整型,特別注意下圖
此圖運行結(jié)果為>,因為無符號整型加減必為大于0的數(shù),所以此類比較需要避免
3、結(jié)束標(biāo)志為\0
模擬實現(xiàn)
int my_strlen(const char *str){ assert(str); if(*str=='\0'){ return 0; } return 1 + my_strlen(str + 1);//采用遞歸方式 }
strcpy函數(shù)(字符串拷貝函數(shù))
將sorc數(shù)組內(nèi)第一個\0前(包括\0)的所有內(nèi)容拷貝到dest數(shù)組。
注意點
1、dest數(shù)組需要足夠容納source數(shù)組
2、source數(shù)組一定要有\(zhòng)0作為中止標(biāo)識
3、dest數(shù)組要可以更改
4、\0會被拷入
模擬實現(xiàn)
char *my_strcpy(char *dest,const char *sorc) { assert(dest && sorc); char *ret = dest; while (*dest++ = *sorc++)//當(dāng)/0被最后一次拷入時,跳出循環(huán) { ; } return ret; }
strcat函數(shù)(字符串銜接函數(shù))
從dest數(shù)組的第一個\0開始將sorc函數(shù)內(nèi)第一個\0前的全部內(nèi)容拷貝,dest函數(shù)的第一個\0會被覆蓋,sorc函數(shù)的\0會被拷入。
注意點
1、dest數(shù)組要足夠容納自身和source數(shù)組
2、dest數(shù)組必須空間可修改
3、dest、source數(shù)組都有\(zhòng)0
4、不可以自己拷貝自己,因為沒有中止條件
模擬實現(xiàn)
char *my_strcat(char *dest, const char *sorc) { char *ret = dest; while (*dest != '\0') { dest++; } while (*dest++ = *sorc++) { ; } return ret; }
strcmp函數(shù)
比較兩個字符串,逐位比較,若對應(yīng)位不相同則返回ASCII碼相減的值,若每一位相同(即整個字符串相同)返回0。
注意點
1、比較的不是長度,而是對應(yīng)位置的ASCII碼值
模擬實現(xiàn)
int my_strcmp(const char *str1, const char *str2) { assert(str1 && str2); while (*str1 == *str2) { if (*str1 == '\0' && *str2 == '\0') { return 0; } str1++; str2++; } return *str1 - *str2; }
strstr函數(shù)
在母串中尋找子串,若找到則返回母串中子串的首地址,若沒找的則返回空指針
模擬實現(xiàn)
此處使用暴力方法求解,KMP算法可提供更優(yōu)解
char *my_strstr(char *mum, char *child) { assert(mum && child); const char *pc = mum; while (*pc) { const char *p1 = pc; const char *p2 = child; while (*p1 == *p2 && *p1 && *p2) { p1++; p2++; } if (*p2 == '\0') { return (char *)pc; } pc++; } return NULL; }
strtok函數(shù)
1、兩個參數(shù)(arr源字符串,sep符號字符串(切割標(biāo)志))
2、希望得到第二個字符串時候需要傳入空指針
使用
int main() { char arr[]="skyline&csdn.com"; char arr2[30]={0};//因為strtok函數(shù)會修改源數(shù)組,通常復(fù)制后處理 char sep[]="&."; strcpy(arr2,arr); printf("%s\n",strtok(arr2,sep)); printf("%s\n",strtok(NULL,sep)); printf("%s\n",strtok(NULL,sep)); return 0; }
結(jié)果:
strerror函數(shù)
生成不同的錯誤報警
使用
int main() { prinf("%s\n",strerror(errno));//根據(jù)程序出現(xiàn)的問題輸出報錯字符串 }
memcpy函數(shù)
一個字節(jié)一個字節(jié)的拷貝,共拷貝count個字節(jié);
注意點
1、此函數(shù)要對兩個不相關(guān)的內(nèi)存塊(若相同由于算法限制無法)比如
int main() { int num1[6] = {1, 2, 3, 4, 5, 6}; my_memcpy(num1+2, num1, 16);//希望得到121234 //實際得到121212 for (int i = 0; i < 6;i++){ printf("%d", num1[i]); } return 0; }
模擬實現(xiàn)
void my_memcpy(void *dest, void *src, size_t count){ assert(dest && src); while (count--) { *(((char *)dest)) = *(((char *)src)); dest=(char*)dest+1;//最好不要寫成++(char*)dest,gcc編譯器認(rèn)為(char*)dest不可作為左值 src=(char*)src+1; } }
memmove函數(shù)
注意點
1、可以接受上文出現(xiàn)的相關(guān)內(nèi)存
模擬實現(xiàn)
void my_memmove(void *dest, void *src, size_t count) { assert(dest && src); if (dest > src)//當(dāng)目標(biāo)位置在源位置前,我們要從后向前拷貝 { while (count--) { *(((char *)dest) + count) = *(((char *)src) + count); } } else { while (count--)//)//當(dāng)目標(biāo)位置在源位置后,我們要從前向后拷貝 { *(((char *)dest)) = *(((char *)src)); dest=(char*)dest+1; src=(char*)src+1; } } }
memset函數(shù)
將一個個字節(jié)設(shè)置為某個值,共設(shè)置count個字節(jié)
注意點
1、以字節(jié)為單位設(shè)置的,如果int num[10]={0},memset(num,1,40),并不能使得數(shù)組全為1,因為int數(shù)組中一個元素為4個字節(jié)實際是,每個元素變成01 01 01 01,所以這是錯誤的
到此這篇關(guān)于C語言字符函數(shù)、內(nèi)存函數(shù) 功能及實現(xiàn)的文章就介紹到這了,更多相關(guān)C語言字符函數(shù)、內(nèi)存函數(shù)內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
C++中overload,override,overwrite的區(qū)別詳細(xì)解析
以下是對C++中overload,override,overwrite的區(qū)別進(jìn)行了詳細(xì)的分析介紹,需要的朋友可以過來參考下2013-09-09c++靜態(tài)局部變量和靜態(tài)函數(shù)示例
這篇文章主要介紹了c++靜態(tài)局部變量和靜態(tài)函數(shù)示例,需要的朋友可以參考下2014-04-04C++ clock()解析如何使用時鐘計時的應(yīng)用
本篇文章是對c++中的clock()函數(shù)進(jìn)行了詳細(xì)的分析介紹,需要的朋友參考下2013-06-06C++實現(xiàn)CreatThread函數(shù)主線程與工作線程交互的方法
這篇文章主要介紹了C++實現(xiàn)CreatThread函數(shù)主線程與工作線程交互的方法,是Windows應(yīng)用程序設(shè)計中非常實用的方法,需要的朋友可以參考下2014-10-10利用Matlab實現(xiàn)繪制中秋山間秋月和皓月當(dāng)空效果
中秋節(jié)還有三天就到了,中秋節(jié)啊,闔家團圓的日子。本文將利用Matlab繪制中秋山間秋月和皓月當(dāng)空的動態(tài)效果,感興趣的可以了解一下2022-09-09