摘要:下面將分別模擬實現,,,,,,模擬實現庫函數聲明表示拷貝到哪個目標,表示拷貝源,加修飾,防止被修改,表示拷貝多少個字節斷言和是否為先把的地址賦值給,以便最后返回,每次進來先使用再,為的時候
#include #include #include //void *memcpy( void *dest, const void *src, size_t count );//庫函數聲明//dest表示拷貝到哪個目標,src表示拷貝源,加const修飾,防止被修改,count表示拷貝多少個字節void* my_memcpy(void* dest, const void* src, size_t count){ assert(dest && src);//斷言dest和src是否為NULL void* ret = dest;//先把dest的地址賦值給ret,以便最后返回 while (count--)//count--,每次進來先使用再--,為0的時候退出 { //把src的類型強制轉換為char*并解引用,賦值給強制轉換為char*并解引用的dest *(char*)dest = *(char*)src; dest = (char*)dest + 1;//指針+1 src = (char*)src + 1;//指針+1 } return ret;//返回dest的起始地址}int main(){ int arr1[10] = { 1,2,3,4,5,6,7,8,9,10 }; int arr2[20] = { 2,3,4,5,6,7,8,9,10,11 }; int i = 0; my_memcpy(arr1, arr2, 16); for (i = 0; i < 10; i++) { printf("%d ", arr1[i]); } return 0;}
#include #include #include //void *memmove( void *dest, const void *src, size_t count );//庫函數聲明//dest表示拷貝到哪個目標,src表示拷貝源,加const修飾,防止被修改,count表示拷貝多少個字節void* my_memmove(void* dest, const void* src, size_t count){ assert(dest && src);//斷言dest和src是否為NULL void* ret = dest; //重疊拷貝+不重疊拷貝 assert(dest && src); if (dest < src) { //前->后 while (count--) { *(char*)dest = *(char*)src; dest = (char*)dest + 1; src = (char*)src + 1; } } else { //后->前 while (count--) { *((char*)dest + count) = *((char*)src + count); } } return ret;}int main(){ int arr[] = { 1,2,3,4,5,6,7,8,9,10 }; //memcpy只要完成不重疊的內存拷貝就完成任務 //my_memmove(arr + 2, arr, 16); my_memmove(arr, arr + 2, 16); //內存拷貝時,出現內存重疊的現象,應該使用memmove int i = 0; for (i = 0; i < 10; i++) { printf("%d ", arr[i]); }}
#include #include //char *strstr( const char *string, const char *strCharSet );//庫函數聲明//str1為大的字符串,str2為子字符串char* my_strstr(const char* str1, const char* str2){ //斷言str1,str2是否為NULL assert(str1 && str2); //創建三個指針變量,作用如上圖所示 const char* s1; const char* s2; const char* sp = str1;//sp為記錄str1的起始位置 if (*str2 == "/0")//如果*str2為空,則直接返回str1首地址,輸出 return str1; while (*sp)//當*sp為"/0",表示sp已指向str1最后的位置 { s1 = sp;//把sp指向賦給si s2 = str2;//把str2起始位置賦給s2 while (*s1 && *s2 && *s1 == *s2)//當*s1和*s2的值不為"/0"以及*s1和*s2相等進入循環 { s1++;//兩個指針向后移動,再繼續比較 s2++; } if (*s2 == "/0")//如果成立,表示str2就是str1的子字符串 return sp;//返回sp的地址 sp++;//sp指針向后移動 } return NULL;//如果程序運行到這里,表示str2不是str1的子字符串,則返回NULL}int main(){ char str1[] = "Do the right thing at the right time"; char str2[] = "right"; char* ret = my_strstr(str1, str2); if (NULL == ret) printf("找不到/n"); else printf("%s/n", ret); return 0;}
#include #include //char *strcat( char *strDestination, const char *strSource );//庫函數聲明//dest表示追加字符的目標,src表示要追加的字符串,用const修飾,防止被修改char* my_strcat(char* dest, const char* src){ //判斷dest和src是否為NULL assert(dest && src); //把dest的起始位置賦值給ret,以便返回 char* ret = dest; while (*dest)//當*dest不為"/0",進入循環 { dest++;//dest指針向后移動 } //此時dest的指針已指向最后一個位置 while (*dest++ = *src++)//循環追加字符 { ; } return ret;}int main(){ char str1[20] = "I am "; char str2[] = "zhao"; my_strcat(str1, str2); printf("%s/n", str1); return 0;}
#include #include //int strcmp( const char *string1, const char *string2 );//庫函數聲明//str1和str2表示要對比的字符串,因為不需要修改內容,所以都加const修飾int my_strcmp(const char* str1, const char* str2){ assert(str1, str2);//判斷str1和str2是否為NULL while (*str1 == *str2)//如果*str1和*str2相等,進入循環 { if (*str1 == "/0")//如果str1的值為"/0",表示兩個字符串相等 return 0; str1++;//指針向后移動 str2++; } return *str1 - *str2;//如果兩個字符串不相等,則返回它們的差值}int main(){ char str1[] = "abcdeg"; char str2[] = "abcdef"; int ret = my_strcmp(str1, str2); if (0 > ret) printf("); else if (0 < ret) printf(">/n"); else printf("=/n"); return 0;}
#include #include //char *strcpy( char *strDestination, const char *strSource );//庫函數聲明//dest表示拷貝的目標,src表示拷貝的源,因為源不需要修改,所以const修飾char* my_strcpy(char* dest, const char* src){ //判斷dest和src是否為空 assert(dest && src); //dest的起始位置賦給ret char* ret = dest; while (*dest++ = *src++)//源賦值給目標,源目標指針向后移動 { ; } return ret;}int main(){ char str1[] = "at the not same"; char str2[] = "at the same!!!"; char* ret = my_strcpy(str1, str2); printf("%s/n", ret); perror("test:"); return 0;}
#include #include #include //size_t strlen( const char *string );//庫函數聲明//str表示要計算的字符串,用const修飾,返回值為無符號的int//1.計數器size_t my_strlen(const char* str){ //判斷str是否為NULL assert(str); size_t count = 0;//創建計數變量 while (*str) { str++; count++; } return count;}//2.遞歸size_t my_strlen(const char* str){ //判斷str是否為NULL assert(str); if (*str)//如果*str不等于"/0" { str++;//str指針向后移動 return 1 + my_strlen(str); } else return 0;}//3.指針size_t my_strlen(const char* str){ char* p = str;//把str的起始地址賦值給char*類型的指針變量p while (*str)//當*str不為"/0",進入循環 { str++; } return str - p;//返回首尾指針的差值}int main(){ char str[] = "Today is a good day !"; size_t len = my_strlen(str); printf("%d/n", len); perror("test:"); return 0;}
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://m.specialneedsforspecialkids.com/yun/121537.html
摘要:本文介紹了類的常用接口的使用,并對其進行了模擬實現,對模擬實現中涉及到的深淺拷貝問題進行了解析。在此之前,必須提到一個經典問題。為了解決淺拷貝問題,所以中引入了深拷貝。但是實際使用中需要是第一個形參對象,才能正常使用。 本文介紹了string類的常用接口的使用,并對其進行了模擬實現,對模擬實...
摘要:字符串常量適用于那些對它不做修改的字符串函數。同時,語言提供了一系列庫函數來對操作字符串,這些庫函數都包含在頭文件中。目標空間必須足夠大,以確保能存放源字符串。拷貝個字符從源字符串到目標空間。 前言: ????????字符串是一種非常重要的數據類型,但是C語言不存在顯式的字符串類型,C...
摘要:項目介紹是一個全新的語言的運行時環境,基于目前最新的進行打造,支持最新的語言規范,同時提供了自己的運行時標準庫。同樣也在的基礎上進行打造,實現了一個除開發之外的一個全新的運行環境。發布核心虛擬機的鏡像。整合運行時框架。 showImg(https://segmentfault.com/img/bVbnQXK); polarphp 項目介紹 polarphp是一個全新的PHP語言的運行時...
摘要:幫助函數就是一種典型的其他服務。一些函數則可能返回結構指針作為輸出。宏定義中把大量的函數指針,接口的函數調用定義為宏或者是。這里需要特別指出的是,語言中沒有類型,中使用定義了類型作為類型,取值是宏定義,。 幫助函數就是一種典型的其他服務。在BREW 的應用程序中,不能直接調用標準C庫...
閱讀 1918·2021-11-22 09:34
閱讀 1158·2021-10-09 09:44
閱讀 3046·2021-09-29 09:35
閱讀 3626·2021-09-14 18:01
閱讀 1494·2021-08-16 10:49
閱讀 1095·2019-08-29 14:11
閱讀 858·2019-08-29 12:47
閱讀 3080·2019-08-26 13:47