1、一般認為strcpy函式實現不是很難,流行的strcpy函式寫法是:
[cpp]view plain
copy
char
*my_strcpy(
char
*dst,
const
char
*src)
如果注意到:
1,檢查指標有效性;
2,返回目的指標des;
3,源字串的末尾 '\0' 需要拷貝。
寫出上面實現函式就不在話下。
然而這樣的實現沒有考慮拷貝時記憶體重疊的情況,下面的測試用例就能使呼叫my_strcp函式的程式崩潰:
[cpp]view plain
copy
char
str[10]=
"abc"
; my_strcpy(str+1,str);
然而呼叫系統的strcpy函式程式正常執行,列印str結果為「aabc」!可見系統strcpy函式的實現不是這樣的。
strcpy的正確實現應為:
[cpp]view plain
copy
char
*my_strcpy(
char
*dst,
const
char
*src)
memcpy函式實現時考慮到了記憶體重疊的情況,可以完成指定大小的記憶體拷貝,它的實現方式建議檢視文章「卓越的教練是如何訓練高手的?」,會獲益良多,這裡僅粘帖函式memcpy函式的實現:
[cpp]view plain
copy
void
* my_memcpy(
void
*dst,
const
void
*src,unsigned
intcount)
} else
//源位址和目的位址重疊,高位元組向低位元組拷貝
} return
ret;
}
兩者結合才是strcpy函式的真正實現吧。
2.strcmp函式原型
int
strcmp
(
const
char
*str1,
const
char
*str2)
return
*str1 - *str2;
}
3.strcat函式原型
char
*
strcat
(
char
* strdest ,
const
char
* strsrc)
while
(*strdest++=*strsrc++)
//此處可以加語句*strdest=』\0』;無必要
return
address;
//為了實現鏈式操作,將目的位址返回
}
原 linux select函式詳解
在linux中,我們可以使用select函式實現i o埠的復用,傳遞給 select函式的引數會告訴核心 我們所關心的檔案描述符 對每個描述符,我們所關心的狀態。我們是要想從乙個檔案描述符中讀或者寫,還是關注乙個描述符中是否出現異常 我們要等待多長時間。我們可以等待無限長的時間,等待固定的一段時間,...
原 PHP核心研究 函式的定義
宣告 本文為斯人原創,全部為作者一一分析得之,有不對的地方望賜教。php技術部落格 在csdn也會同步更新的哦.php中,函式的定義 是用關鍵字 function來定義的.function hello str 在 zend zend language parse.y中找到 關鍵字 t functio...
原 PHP核心函式研究之 global
宣告 本文為斯人原創,全部為作者一一分析得之,有不對的地方望賜教。好久沒有寫部落格了 最近事挺多,換了工作,又搬了家.今天就來說說 我們經常用到的global語句吧.我們都知道,在函式體內宣告的變數,作用域只是當前函式體中,一般情況下是訪問不到外部宣告的變數的.因為全域性變數和區域性變數存放在不同的...