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;
}