C語(yǔ)言字符函數(shù)、內(nèi)存函數(shù)功能及實(shí)現(xiàn)代碼
C語(yǔ)言字符函數(shù)、內(nèi)存函數(shù) 功能及實(shí)現(xiàn) strlen函數(shù)(求字符串長(zhǎng)度)注意點(diǎn)模擬實(shí)現(xiàn) strcpy函數(shù)(字符串拷貝函數(shù))注意點(diǎn)模擬實(shí)現(xiàn) strcat函數(shù)(字符串銜接函數(shù))注意點(diǎn)模擬實(shí)現(xiàn) strcmp函數(shù)注意點(diǎn)模擬實(shí)現(xiàn) strstr函數(shù)模擬實(shí)現(xiàn) strtok函數(shù)使用 strerror函數(shù)使用 memcpy函數(shù)注意點(diǎn)模擬實(shí)現(xiàn) memmove函數(shù)注意點(diǎn)模擬實(shí)現(xiàn) memset函數(shù)注意點(diǎn)
strlen函數(shù)(求字符串長(zhǎng)度)
統(tǒng)計(jì)字符串長(zhǎng)度直到\0為止
注意點(diǎn)
1、屬于<string.h>庫(kù)
2、參數(shù)為字符串,返回類型為無(wú)符號(hào)整型,特別注意下圖
此圖運(yùn)行結(jié)果為>,因?yàn)闊o(wú)符號(hào)整型加減必為大于0的數(shù),所以此類比較需要避免
3、結(jié)束標(biāo)志為\0

模擬實(shí)現(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)第一個(gè)\0前(包括\0)的所有內(nèi)容拷貝到dest數(shù)組。
注意點(diǎn)
1、dest數(shù)組需要足夠容納source數(shù)組
2、source數(shù)組一定要有\(zhòng)0作為中止標(biāo)識(shí)
3、dest數(shù)組要可以更改
4、\0會(huì)被拷入
模擬實(shí)現(xiàn)
char *my_strcpy(char *dest,const char *sorc)
{
assert(dest && sorc);
char *ret = dest;
while (*dest++ = *sorc++)//當(dāng)/0被最后一次拷入時(shí),跳出循環(huán)
{
;
}
return ret;
}
strcat函數(shù)(字符串銜接函數(shù))
從dest數(shù)組的第一個(gè)\0開(kāi)始將sorc函數(shù)內(nèi)第一個(gè)\0前的全部?jī)?nèi)容拷貝,dest函數(shù)的第一個(gè)\0會(huì)被覆蓋,sorc函數(shù)的\0會(huì)被拷入。
注意點(diǎn)
1、dest數(shù)組要足夠容納自身和source數(shù)組
2、dest數(shù)組必須空間可修改
3、dest、source數(shù)組都有\(zhòng)0
4、不可以自己拷貝自己,因?yàn)闆](méi)有中止條件
模擬實(shí)現(xiàn)
char *my_strcat(char *dest, const char *sorc)
{
char *ret = dest;
while (*dest != '\0')
{
dest++;
}
while (*dest++ = *sorc++)
{
;
}
return ret;
}
strcmp函數(shù)
比較兩個(gè)字符串,逐位比較,若對(duì)應(yīng)位不相同則返回ASCII碼相減的值,若每一位相同(即整個(gè)字符串相同)返回0。
注意點(diǎn)
1、比較的不是長(zhǎng)度,而是對(duì)應(yīng)位置的ASCII碼值
模擬實(shí)現(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ù)
在母串中尋找子串,若找到則返回母串中子串的首地址,若沒(méi)找的則返回空指針
模擬實(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、兩個(gè)參數(shù)(arr源字符串,sep符號(hào)字符串(切割標(biāo)志))
2、希望得到第二個(gè)字符串時(shí)候需要傳入空指針

使用
int main()
{
char arr[]="skyline&csdn.com";
char arr2[30]={0};//因?yàn)閟trtok函數(shù)會(huì)修改源數(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ù)
生成不同的錯(cuò)誤報(bào)警

使用
int main()
{
prinf("%s\n",strerror(errno));//根據(jù)程序出現(xiàn)的問(wèn)題輸出報(bào)錯(cuò)字符串
}
memcpy函數(shù)
一個(gè)字節(jié)一個(gè)字節(jié)的拷貝,共拷貝count個(gè)字節(jié);
注意點(diǎn)
1、此函數(shù)要對(duì)兩個(gè)不相關(guān)的內(nèi)存塊(若相同由于算法限制無(wú)法)比如
int main()
{
int num1[6] = {1, 2, 3, 4, 5, 6};
my_memcpy(num1+2, num1, 16);//希望得到121234
//實(shí)際得到121212
for (int i = 0; i < 6;i++){
printf("%d", num1[i]);
}
return 0;
}
模擬實(shí)現(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ù)
注意點(diǎn)
1、可以接受上文出現(xiàn)的相關(guān)內(nèi)存
模擬實(shí)現(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ù)
將一個(gè)個(gè)字節(jié)設(shè)置為某個(gè)值,共設(shè)置count個(gè)字節(jié)
注意點(diǎn)
1、以字節(jié)為單位設(shè)置的,如果int num[10]={0},memset(num,1,40),并不能使得數(shù)組全為1,因?yàn)閕nt數(shù)組中一個(gè)元素為4個(gè)字節(jié)實(shí)際是,每個(gè)元素變成01 01 01 01,所以這是錯(cuò)誤的
到此這篇關(guān)于C語(yǔ)言字符函數(shù)、內(nèi)存函數(shù) 功能及實(shí)現(xiàn)的文章就介紹到這了,更多相關(guān)C語(yǔ)言字符函數(shù)、內(nèi)存函數(shù)內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
c++利用vector創(chuàng)建二維數(shù)組的幾種方法總結(jié)
這篇文章主要介紹了c++利用vector創(chuàng)建二維數(shù)組的幾種方法總結(jié),具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-11-11
C語(yǔ)言自定義函數(shù)的實(shí)現(xiàn)
這篇文章主要介紹了C語(yǔ)言自定義函數(shù)的實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2021-01-01
C語(yǔ)言實(shí)現(xiàn)字符串轉(zhuǎn)浮點(diǎn)函數(shù)的示例
字符串不僅可以轉(zhuǎn)換為整數(shù),也可以轉(zhuǎn)換為浮點(diǎn)數(shù),本文主要介紹了C語(yǔ)言實(shí)現(xiàn)字符串轉(zhuǎn)浮點(diǎn)函數(shù)的示例,具有一定的參考價(jià)值,感興趣的可以了解一下2022-02-02
哈希表實(shí)驗(yàn)C語(yǔ)言版實(shí)現(xiàn)
以下是對(duì)哈希表實(shí)驗(yàn)用C語(yǔ)言實(shí)現(xiàn)的代碼進(jìn)行了詳細(xì)的分析介紹,需要的朋友可以參考下2013-07-07
基于C語(yǔ)言實(shí)現(xiàn)UDP服務(wù)器
這篇文章主要為大家詳細(xì)介紹了如何使用C語(yǔ)言編寫一個(gè)簡(jiǎn)單的UDP服務(wù)器程序,以及如何接收和處理客戶端發(fā)送的數(shù)據(jù),有需要的小伙伴可以了解下2024-10-10
利用C++和QT實(shí)現(xiàn)Log自定義日志系統(tǒng)
這篇文章主要為大家詳細(xì)介紹了如何利用C++和QT實(shí)現(xiàn)Log自定義日志系統(tǒng),文中的示例代碼講解詳細(xì),具有一定的借鑒價(jià)值,有需要的小伙伴可以參考下2023-12-12

