溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

怎么用C語言實(shí)現(xiàn)常用字符串庫函數(shù)

發(fā)布時(shí)間:2021-11-05 13:42:05 來源:億速云 閱讀:155 作者:iii 欄目:開發(fā)技術(shù)

本篇內(nèi)容介紹了“怎么用C語言實(shí)現(xiàn)常用字符串庫函數(shù)”的有關(guān)知識(shí),在實(shí)際案例的操作過程中,不少人都會(huì)遇到這樣的困境,接下來就讓小編帶領(lǐng)大家學(xué)習(xí)一下如何處理這些情況吧!希望大家仔細(xì)閱讀,能夠?qū)W有所成!

    一、實(shí)現(xiàn)memcpy

    將src所指向的內(nèi)容拷貝到dst所指向的位置,拷貝len個(gè)字節(jié)。

    • memcpy是內(nèi)存拷貝函數(shù)

    • memcpy在使用的時(shí)候不用考慮類型,以字節(jié)為單位進(jìn)行拷貝

    • 遇到"\0"的時(shí)候不會(huì)停下,所以拷貝字符串的時(shí)候最好還是用strcpy,它更安全。

    void *Mymemcpy(void * dst, const void * src, int len){
    	void *ret = dst;
    	assert(src);
    	assert(dst);
    	while (len--){
    		*(char *)dst = *(char *)src;
    		dst = (char *)dst + 1;
    		src = (char *)src + 1;
    	}
    	return ret;
    }
    int main(){
    	char str[100] = "ABCDE";
    	Mymemcpy(str, str + 2, 2);
    	printf("%s", str);
    	system("pause");
    	return 0;
    }

    怎么用C語言實(shí)現(xiàn)常用字符串庫函數(shù)

    但是當(dāng)我們修改了測(cè)試用例后發(fā)現(xiàn)了如下結(jié)果

    怎么用C語言實(shí)現(xiàn)常用字符串庫函數(shù)

    出現(xiàn)這種情況的原因很簡(jiǎn)單,因?yàn)槲覀冊(cè)醋址氖椎刂返陀谀繕?biāo)字符串的首地址,當(dāng)我們默認(rèn)從左向右拷貝的時(shí)候第一個(gè)字符串會(huì)覆蓋第二個(gè)字符串,所以出現(xiàn)了全A的情況,這就是內(nèi)存重疊拷貝,要解決這個(gè)問題非常簡(jiǎn)單,只需要在拷貝之前加一個(gè)判斷,如果源字符串的首地址低于目標(biāo)字符串的首地址則我們從右向左拷貝,這樣就可以完美解決這個(gè)問題。

    二、memmove模擬實(shí)現(xiàn)

    這里我們重復(fù)剛才的測(cè)試用例,發(fā)現(xiàn)加入了判斷并從右向左拷貝了之后沒有出現(xiàn)全A的情況。

    void * Mymemmove(void * dst, const void *src, int len){
    
    	char *_src = (char*)src;
    	char *_dst = (char*)dst;
    	if (_dst > _src&&_dst < _src + len){
    		_dst = _dst + len - 1;
    		_src = _src + len - 1;
    
    		while (len--){
    			*_dst = *_src;
    			_dst--;
    			_src--;
    		}
    	}
    	else {
    		while (len--){
    			*_dst = *_src;
    			_dst++;
    			_src++;
    		}
    	}
    	return dst;
    }
    int main(){
    	char str[100] = "ABCDE";
    	int len = strlen(str);
    	memcpy(str+1, str , len);
    	printf("%s", str);
    	system("pause");
    	return 0;
    }

    怎么用C語言實(shí)現(xiàn)常用字符串庫函數(shù)

    三、strlen的模擬實(shí)現(xiàn)

     1.計(jì)數(shù)器方法:

    int Mystrlen(char * str){
    	int count = 0;
    	while (*str != 0){
    		str++;
    		count++;
    	}
    	return count;
    }
    int main(){
    	char a[] = "dadai";
    	int aa=Mystrlen(a);
    	printf("%d", aa);
    	system("pause");
    	return 0;
    }

    2.遞歸方式:

    int Mystrlen(char * str){
    	if (*str == '\0'){
    		return 0;
    	}
    	else return (1 + Mystrlen(str + 1));
    }//1+1+1+1+1+0
    int main(){
    	char a[] = "dadai";
    	int aa=Mystrlen(a);
    	printf("%d", aa);
    	system("pause");
    	return 0;
    }

    3.利用指針實(shí)現(xiàn):

    int Mystrlen(char * str){
    	char *p = str;
    	while (*p){
    		p++;
    	}
    	return (p - str);
    }
    
    int main(){
    	char a[] = "dadai";
    	int aa=Mystrlen(a);
    	printf("%d", aa);
    	system("pause");
    	return 0;
    }

    四、strcpy的模擬實(shí)現(xiàn)

    將src所指向的內(nèi)容拷貝到dst所指向的存儲(chǔ)單元。

    char * Mycpy(char *dst, const char * src){
    assert(dst != NULL && src !=NULL);
    char *Mycpy = dst;
    while((*dst++ = *src++) != '\0');
    return Mycpy;
    }
    int main(){
    
    
    	char src []= "daadok";
    	char dst[10] ;
    	Mycpy(dst, src);
    	printf("%s", dst);
    	system("pause");
    	return 0;
    }

    五、strcmp的模擬實(shí)現(xiàn)

    strcmp用于比較兩個(gè)字符串是否相等,若相等則返回0,若dst>src則返回1,否則換回-1.

    int Mystrcmp(const char* dst,const char * src){
    	while (*dst&&*src&&(*dst == *src)){
    		dst++;
    		src++;
    	}
    	if (*dst > *src){
    		return 1;
    	}
    	else if (*dst < *src){
    		return -1;
    	}
    	else if (*dst == *src){
    		return 0;
    	}
    }
    int main(){
    	char str1[] = "abcdefg";
    	char str2[] = "dfd";
    	int a=Mystrcmp(str1, str2);;
    	printf("%d", a);
    	system("pause");
    	return 0;
    }

    六、strstr模擬實(shí)現(xiàn)

    在dst中找到第一次與src相等的位置并輸出這個(gè)位置之后dst所指向的內(nèi)容。

    char *mystrstr( const char *dst,const  char *src){
    	assert(dst);
    	assert(src);
    	const char *p = dst;
    	while (*p){
    		const char *movep = p;
    		const char *sp = src;
    		while(*movep && *sp&& *sp== *movep){
    			sp++;
    			movep++;
    		}
    		if (*sp == '\0'){
    			return (char *)p;
    		}
    		p++;
    	}
    	return NULL;
    }
    int main(){
    	const char* dst = "abcd123456";
    	const char*src = "cd";
    	char *ret= mystrstr(dst, src);
    	printf("%s", ret);
    	system("pause");
    	return 0;
    }

    怎么用C語言實(shí)現(xiàn)常用字符串庫函數(shù)

    七、模擬實(shí)現(xiàn)strcat

    把src所指向的內(nèi)容拼接到dst所指向內(nèi)容的末尾。

    char * mystrcat(char*dst, const char*src){
    	assert(src);
    	assert(dst);
    	char*ret = dst;
    	while (*dst){
    		dst++;
    	}
    	while (*src){
    		*dst = *src;
    		dst++; src++;
    	}
    	return ret;
    }
    int main(){
    	char dst[64] = "abcd";
    	char *src = "efg";
    	mystrcat(dst, src);
    	printf("%s", dst);
    	system("pause");
    	return 0;
    }

    怎么用C語言實(shí)現(xiàn)常用字符串庫函數(shù)

    “怎么用C語言實(shí)現(xiàn)常用字符串庫函數(shù)”的內(nèi)容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業(yè)相關(guān)的知識(shí)可以關(guān)注億速云網(wǎng)站,小編將為大家輸出更多高質(zhì)量的實(shí)用文章!

    向AI問一下細(xì)節(jié)

    免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

    AI