常見幾個字串函式實現程式碼
阿新 • • 發佈:2019-02-05
(1)size_t strlen(const char *str);
size_t strlen(const char *str)
{
assert(str != NULL);
unsigned int cnt = 0;
while(*str++)
++cnt;
return cnt;
}
(2)char *strcpy(char *strDest, const *strSrc)
char *strcpy(char *strDest, const *strSrc) { if(strDest == strSrc) return strDest; assert( (strDest != NULL) && (strSrc != NULL)); char *retAddr = strDest; while( *strDest++ = *strSrc++); return retAddr; }
(3)char *strncpy(char *dest,const char *src, size_t cnt)
如果在src指向的陣列中遇到一個空字元 '\0',則strncpy函式為dest指向的陣列新增空字元直到寫完n個字元的總數量。
這點與memcpy函式不同,memcpy僅是複製n個位元組資料,不檢查資料型別,也不新增任何字元。
char *strncpy(char *dest,const char *src, size_t cnt) { assert((dest!=NULL)&&(src!=NULL)); char *retAddr=dest; while( cnt &&(*dest++ = *src++) ) cnt--; if(cnt) { while(--cnt) { *dest++ = '\0'; } } return retAddr; }
(4)char *strcat(char *strDes, const char *strSrc)
char *strcat(char *strDes, const char *strSrc)
{
assert( (strDes != NULL) && (strSrc!= NULL));
char *retAddr = strDes;
while(*strDes)
strDes++;
while( *strDes++ = *strSrc++);
return retAddr;
}
(5)char *strncat(char *strDes, const char *strSrc, size_t cnt);
當遇到空字元或已經複製n個字元時,複製操作結束。
注意,若已經複製n個字元,但是strSrc還沒遇到結束符,此時,要在strDes後新增結束符 '\0' ;char *strncat(char *strDes, const char *strSrc, size_t cnt)
{
assert( (strDes != NULL) && (strSrc != NULL));
char *retAddr = strDes;
while(*strDes)
strDes++;
while(cnt--)
if(!(*strDes++ = *strSrc++)) //注意
return retAddr;
*strDes = '\0';
return retAddr;
}
(6)int strcmp(const char *str1, const char *str2)
int strcmp(const char *str1, const char *str2)
{
assert((str1 != NULL) && (str2 != NULL));
while(*str1 && *str2 && (*str1 == *str2))
{
str1++;
str2++;
}
return (*(unsigned char*)str1 - *(unsigned char*)str2);
}
(7)int strncmp(const char *str1, const char *str2, size_t cnt)
int strncmp(const char *str1, const char *str2, size_t cnt)
{
assert((str1 != NULL) && (str2 != NULL));
if(!cnt)
return 0;
while( --cnt && *str1 && *str2 && (*str1 == *str2) ) 或while( --cnt && *str1 && (*str1 == *str2) )
{
str1++;
str2++;
}
return (*(unsigned char*)str1 - *(unsigned char*)str2);
}