總結與字串有關的模擬實現函式程式碼
阿新 • • 發佈:2018-11-23
1.strcpy實現字串的拷貝
char* my_strcpy(char* dest,const char* src)
{
char* temp = dest;
assert(src != NULL);
while(*dest++ = *src++)
{
;
}
return temp;
}
2.strcat實現字串的連線
char* my_strcat(char* arr,const char* src) { char* temp = arr; assert(src != NULL); while(*arr != '\0') { arr++; } while(*arr++ = *src++) { ; } return temp; }
3.strstr實現子字串在目標字串中的查詢
char* my_strstr(const char* dest,const char* src)//函式返回找到目標開始匹配且成功的起始位置 { const char* s1 = dest;//定義s1讓dest備份 const char* s2 = src; const char* ptr = dest; assert(src != NULL); while(*ptr)//ptr++尋找開始匹配的位置 { s1 = ptr;//記住開始匹配的位置 s2 = src;//記住子字串開始的位置 while(*s1 && *s2 && *s1 == *s2)//有一個條件為假結束 { s1++; s2++; } if(*s2 == '\0')//當s2說明匹配成功 返回目標字串的開始位置 return (char*)ptr; ptr++;//假設開始匹配卻未匹配成功*ptr沒有成為'\0'時,ptr加加開始下一輪查詢 } return NULL;//沒有找到時返回空指標 }
4.strcmp實現字串的比較
int my_strcmp(const char* dest,const char* src) { assert(dest != NULL);//判斷傳過來的指標是不是為空 assert(src != NULL); while(*dest == *src)//當src為'\0'時結束,但他的值賦給了dest, //所以在迴圈內部返回0;然後跳出迴圈 { if(*dest == '\0') { return 0; } dest++;src++; } if(*dest > *src)//不要把判斷寫在if之後,因為當dest為0時程式沒有機會來到最後 { return -1; } else { return 1; } }
5.memcpy(也同時實現了memmove)記憶體的字元拷貝
void* my_memcpy(void* dest,const void* src,int count)
{
void* temp = dest;
assert(dest != NULL);
assert(src != NULL);
while(count--)
{
if(src < dest)//不判斷指標的大小即是memcpy,判斷指標大小函式便成為了memmove函式。
*((char*)dest+1) = *((char*)src+1);
//((char*)dest)++;
//((char*)src)++;
else
{
*((char*)dest+count) = *((char*)src+count);
}
}
return temp;
}
6.strchr在目標字串中查詢字元
char* my_strchr(const char* dest,const char* src)
{
while(*dest)
{
if(*dest == *src)
return dest;
dest++;
}
return NULL;
}
7.strncpy自己定義要拷貝的字串長度
char* my_strncpy(char* dest,const char* src,int count)
{
char* ret = dest;
assert(src != NULL);
while(count--)//count來控制迴圈次數
{
*dest++ = *src++;
}
*dest = '\0';//當賦值結束時應當讓目標字串以‘\0’結束
return ret;
}
8.strncmp自己定義需要比較的字串長度
int my_strncmp(const char* dest,const char* src,int count)
{
assert(dest != NULL);
assert(src != NULL);
while((*dest == *src) && --count)//必須同時滿足倆個條件時才滿足
{
if(*dest == '\0')//如果*dest為0,說明*src已經結束返回0
return 0;
dest++;
src++;
}
return *src-*dest;//直接返回比較結果數字
}
9.strncat自己定義需要連線字串的長度
char* my_strncat(char* dest,const char* src,int count)
{
char* ret = dest;//儲存dest的起始位置
if(count < 0)
return NULL;//判斷假如count輸入為負數時
assert(src != NULL);
while(*dest != '\0')
{
dest++;
}
while(count--)
{
*dest++ = *src++;
}
*dest = '\0';//當賦值結束時應當讓目標字串以‘\0’結束
return ret;
}