1. 程式人生 > >string庫之模擬實現strchr、strrchr與memchr

string庫之模擬實現strchr、strrchr與memchr

原型:

    C庫string.h中的strchr函式

描述:

    C 庫函式 char *strchr(const char *str, int c) 在引數 str 所指向的字串中搜索第一次出現字元 c(一個無符號字元)的位置。

引數:

    str:要被檢索的C字串。

    c:在str中要搜尋的字元。

返回值:

    該函式返回在字串 str 中第一次出現字元 c 的位置,如果未找到該字元則返回 NULL。

模擬實現strchr:

char *strchr(const char *str, int c)  
{  
    assert(NULL != str);  
  
    while (*str && (*str != (char)c))
		++str;

	if ((char)c == *str)	//包含了*str和c都為0的情況。
		return (char *)str;

    return NULL;  
}  

原型:

    C庫string.h中的strrchr函式

描述:

    C 庫函式 char *strrchr(const char *str, int c) 在引數 str 所指向的字串中搜索最後一次出現字元 c(一個無符號字元)的位置。

引數:

    str:要被檢索的C字串。

    c:要搜尋的字元。以 int 形式傳遞,但是最終會轉換回 char 形式。

返回值:

    該函式返回在字串 str 中最後一次出現字元 c 的位置,如果未找到該字元則返回 NULL。

模擬實現strrchr:

第一種方法:從頭往後找

char *my_strrchr(const char* str, int c)
{
	char *ret = NULL;

	assert(NULL != str);

	while (*str)
		if (*str == (char)c) //如果存在,ret儲存地址
			ret = (char *)str; //強制轉換指標型別,賦給ret
		else
			++str;

	if ((char)c == *str) //考慮str第一個字元為'\0'的情況
		ret = (char *)str; //強制轉換指標型別,賦給ret

	return ret;
}

第二種方法:從後往前找
char *my_strrchr(const char* str, int c)
{
	char *ret = (char *)str;//強制轉換指標型別,賦給ret

	while (*str)	//指向原str字串最後一位
		++str;

	while (*str != (char)c && (str >= ret))
		--str;

	if (str >= ret)
		return (char *)str;//強制轉換指標型別,返回。
	
	return NULL;
}


原型:

    C庫string.h中的memchr函式

描述:

    C 庫函式 void *memchr(const void *str, int c, size_t n) 在引數 str 所指向的字串的前 n 個位元組中搜索第一次出現字元c(一個無符號字元)的位置。

引數:

    str:指向要執行搜尋的記憶體塊。

    c:以 int 形式傳遞的值,但是函式在每次位元組搜尋時是使用該值的無符號字元形式。

    n:要被分析的位元組數。

返回值:

    該函式返回一個指向匹配位元組的指標,如果在給定的記憶體區域未出現字元,則返回 NULL。

模擬實現memchr:

void *my_memchr(const void *str, int c, size_t n)
{
	char *pstr = (char *)str;

	assert(NULL != str);

	while (n--)
		if ((char)c == *pstr)
			return pstr;
		else
			++pstr;
	
	return NULL;
}