首先我們來看strlen函數,它主要是求一個字符串的長度,所以返回的應該是int型類型,其主要方法是將字符串從頭到尾進行遍歷時進行計數,因此實現起來並不是很難,其主要函數代碼如下:
int length(char *p)
{
int len = 0;
while (*p != 0)
{
len++;
p++;
}
return len;
}
因爲字符長度是不包括‘\0’,所以返回時不用進行+1操作。
然後是關於strncat函數的實現,它主要是對兩個字符串進行有個數的連接,注意,是有個數的連接,這也是它和strcat不同的地方,strcat是將整個字符串追加到另一個字符串上,不夠靈活。strncat的主要函數方法就是通過指針賦值的方法將源操作數追加到目的操作數上,當然這裏的目的操作數必須是有足夠空間的,是能夠存放下你所給的字符串長度才行。
具體的代碼如下:
void *my_strncat(char *dest, const char *src, int k)
{
assert(dest);
assert(src);
char *tmp = dest; //將目的操作數保存起來
while (*dest) //首先將目的操作數指向‘\0’處
{
dest++;
}
while (k) //再將源操作數追加上去
{
*dest++ = *src++;
k--;
}
return tmp;
}
這裏要說的是,在你執行這個函數是,要將你的目的操作數保存起來,因爲當你執行完整個函數時,你的目的操作數的指針已經指向的不是你字符串的首地址了,而當你要返回時必須返回的是你目的操作數的首地址,因此應提前保存起來。
最後一個就是strstr函數,其主要目的是找子串,它的主要函數方法是兩層循環嵌套,第一層循環是以目的操作數作爲循環條件的,它主要是爲了找到它與源操作數相等時的起始位置,當找到時再進入源操作數的循環,判斷整個源操作數是否爲它的子串。
主要函數代碼如下:
void *my_strstr(char *dest, const char *src)
{
assert(dest);
assert(src);
char *tmp = NULL;
while (*dest)
{
while (*src)
{
if (*dest == *src)
{
dest++;
src++;
}
else break;
}
if (*src == 0)
{
return tmp; //返回的是找到時目的操作數的位置
}
else
{
dest++;
tmp = dest; //找到其相等時的位置
}
}
}
這裏注意的還是返回值的問題,它返回的是你目的操作數與源操作數相等時的地址,因此要用指針對其進行標識。