實現C中的strcpy函式
1、strcpy庫函式介紹
C語言中在標頭檔案<string.h>中,C++中在<cstring>中;
函式原型:char * strcpy(char * destStr, char srcStr);
函式功能:將srcStr中的字串拷貝到destStr的記憶體中;通過字串結束符'\0'來控制結束,如果destStr預留的記憶體不夠的話會“溢位”。
2、實現strcpy函式
這個也是一個經常出的面試題,如果面試者只是根據功能寫出如下的程式碼
char * my_strcpy(char *dest, char * src)
{
if(dest == NULL || src == NULL)
return NULL;
char *p_dest = dest;
char *p_src = src;
while(*p_src != '\0')
{
*p_dest = *p_src;
++p_dest;
++p_src;
}
*p_dest = '\0';
return dest;
}
這樣一個實現看似是正確的:1)考慮了空指標;
2)返回課目的地址;
3)目的串末尾為'\0';
但是它並沒有考慮“記憶體重疊”問題。這個題目的考察點和memcpy是一樣的,都在考察“記憶體重疊”,如果面試官先問你memcpy的程式碼,然後再問你這個你可能會意識到這個問題。但是如果面試官直接問你strcpy的實現,可能你就蒙了。
對strcpy的改進:
void * my_memcpy(void *dst,const void *src,unsigned int count)
{
assert(dst);
assert(src);
void * ret = dst;
if (dst <= src || (char *)dst >= ((char *)src + count))//源地址和目的地址不重疊,低位元組向高位元組拷貝
{
while(count--)
{
*(char *)dst = *(char *)src;
dst = (char *)dst + 1;
src = (char *)src + 1;
}
}
else //源地址和目的地址重疊,高位元組向低位元組拷貝
{
dst = (char *)dst + count - 1;
src = (char *)src + count - 1;
while(count--)
{
*(char *)dst = *(char *)src;
dst = (char *)dst - 1;
src = (char *)src - 1;
}
}
return ret;
}
char *my_strcpy(char *dst,const char *src)
{
assert(dst != NULL);
assert(src != NULL);
char *ret = dst;
my_memcpy(dst,src,strlen(src)+1);
return ret;
}
這樣就可以有效地處理“記憶體重疊”問題。
相關文章
- c中strcpy函式的使用注意:(來源:c和指標)函式指標
- 模擬實現字串函式strlen , strcpy ,strcmp字串函式
- C中atoi和strcpy的自定義實現
- strcpy函式原型函式原型
- 實現c中memcpy函式memcpy函式
- memmove和memcpy 以及strcmp strcpy幾個庫函式的實現memcpy函式
- strcpy函式和memcpy函式的區別函式memcpy
- 為什麼C語言的strcpy函式有漏洞(轉)C語言函式
- 【C語言】字串複製。(不能使用strcpy函式)C語言字串函式
- strcpy,strncpy,memcpy,memmove,memset函式memcpy函式
- C/C++實現strcpy和strcat兩個功能C++
- C++ 初始化函式的實現C++函式
- C#函式實現的小功能集合C#函式
- 【C語言】常用的字串函式及相關函式的自我實現C語言字串函式
- c++字串查詢函式實現C++字串函式
- [C練習]實現memcpy原型函式memcpy原型函式
- C可變引數函式 實現函式
- strlen strcat strcpy strcmp 自己實現
- 在 JS 中實現 Laravel 的 ROUTE 函式JSLaravel函式
- js中trim函式的簡單實現JS函式
- java如何實現javascript中的eval函式JavaScript函式
- PHP中實現函式過載PHP函式
- C++11中的函式C++函式
- C# 中的本地函式C#函式
- C++中的strrev函式C++函式
- (函式)實現strstr函式函式
- c語言中通過函式指標實現函式過載C語言函式指標
- C語言-字串函式的實現(一)之strlenC語言字串函式
- C語言-字串函式的實現(五)之strstrC語言字串函式
- 案例展示自定義C函式的實現過程函式
- C++ 字串截斷的實現(基礎函式)C++字串函式
- C 語言實現泛型 swap 函式泛型函式
- [C練習]my_atoi函式實現函式
- C#中解構函式,Close函式,Dispose函式的區別C#函式
- C/C++—— C++中函式重寫和函式過載C++函式
- python中實現函式過載Python函式
- js中實現單分派泛函式JS函式
- PHP中實現函式過載薦PHP函式