91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

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

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

怎么用C語言實現常用字符串庫函數

發布時間:2021-11-05 13:42:05 來源:億速云 閱讀:157 作者:iii 欄目:開發技術

本篇內容介紹了“怎么用C語言實現常用字符串庫函數”的有關知識,在實際案例的操作過程中,不少人都會遇到這樣的困境,接下來就讓小編帶領大家學習一下如何處理這些情況吧!希望大家仔細閱讀,能夠學有所成!

    一、實現memcpy

    將src所指向的內容拷貝到dst所指向的位置,拷貝len個字節。

    • memcpy是內存拷貝函數

    • memcpy在使用的時候不用考慮類型,以字節為單位進行拷貝

    • 遇到"\0"的時候不會停下,所以拷貝字符串的時候最好還是用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語言實現常用字符串庫函數

    但是當我們修改了測試用例后發現了如下結果

    怎么用C語言實現常用字符串庫函數

    出現這種情況的原因很簡單,因為我們源字符串的首地址低于目標字符串的首地址,當我們默認從左向右拷貝的時候第一個字符串會覆蓋第二個字符串,所以出現了全A的情況,這就是內存重疊拷貝,要解決這個問題非常簡單,只需要在拷貝之前加一個判斷,如果源字符串的首地址低于目標字符串的首地址則我們從右向左拷貝,這樣就可以完美解決這個問題。

    二、memmove模擬實現

    這里我們重復剛才的測試用例,發現加入了判斷并從右向左拷貝了之后沒有出現全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語言實現常用字符串庫函數

    三、strlen的模擬實現

     1.計數器方法:

    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.利用指針實現:

    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的模擬實現

    將src所指向的內容拷貝到dst所指向的存儲單元。

    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的模擬實現

    strcmp用于比較兩個字符串是否相等,若相等則返回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模擬實現

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

    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語言實現常用字符串庫函數

    七、模擬實現strcat

    把src所指向的內容拼接到dst所指向內容的末尾。

    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語言實現常用字符串庫函數

    “怎么用C語言實現常用字符串庫函數”的內容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業相關的知識可以關注億速云網站,小編將為大家輸出更多高質量的實用文章!

    向AI問一下細節

    免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

    AI

    清丰县| 龙岩市| 北辰区| 琼海市| 金秀| 准格尔旗| 南投市| 新晃| 龙里县| 奉新县| 本溪| 邯郸市| 雷州市| 读书| 石门县| 大名县| 晴隆县| 庐江县| 溆浦县| 承德市| 长宁区| 公安县| 万宁市| 屏东县| 静宁县| 潞西市| 榕江县| 昭苏县| 个旧市| 吉首市| 平江县| 七台河市| 凤城市| 岳普湖县| 公安县| 呼伦贝尔市| 新蔡县| 旬阳县| 黄山市| 渭源县| 江山市|