strcat與strncat原型
//////////////////////////////////////////////////////////////////////////
//功能爲連接兩個字符串,把src連接到dest後面;返回dest地址;
//////////////////////////////////////////////////////////////////////////
char* mystrcat(char* dest,const char* src)
{
assert((dest != NULL) && (src != NULL));
char* res = dest;
while(*dest) // *dest != '\0'
{
dest++;
}
while(*dest++ = *src++)
{
NULL;
}
return res;
}
/*
//功能爲連接兩個字符串,把src連接到dest後面;返回dest地址;
*/
char* mystrncat(char* dest,const char* src,unsigned int num)
{
assert((dest != NULL) && (src != NULL));
if (!num)
{
return dest;
}
char* res = dest;
while(*dest) // *dest != '\0'
{
dest++;
}
while(*dest++ = *src++)
{
if (--num == 0)
{
*dest = '\0';
break;
}
}
return res;
}
strchr與strrchr原型
//////////////////////////////////////////////////////////////////////////
//功能爲查找str中首次出現c的位置,如有有,則返回出現位置,否則返回NULL;
//////////////////////////////////////////////////////////////////////////
/*
const char * strchr ( const char * str, int character );
char * strchr ( char * str, int character )
*/
char* mystrchr(char* str,char c)
{
assert(str != NULL);
while(*str && *str != c)
{
str++;
}
if (*str == c)
return str;
return NULL;
}
//////////////////////////////////////////////////////////////////////////
//功能爲查找str中最後一次出現c的位置,如有有,則返回出現位置,否則返回NULL;
//////////////////////////////////////////////////////////////////////////
char* mystrrchr(char* str,char c)
{
assert(str != NULL);
char* res = str;
while(*res++)
;
while((--res != str) && (*res != c))
;
if (*res == c)
return res;
return NULL;
}
strcmp與strncmp原型
//////////////////////////////////////////////////////////////////////////
//功能爲比較兩個字符串;
//當str1指向的字符串大於str2指向的字符串時,返回正數。
//當str1指向的字符串等於str2指向的字符串時,返回0。
//當str1指向的字符串小於str2指向的字符串時,返回負數。;
//////////////////////////////////////////////////////////////////////////
int mystrcmp(const char* str1,const char* str2)
{
assert((str1 != NULL) && (str2 != NULL));
while (*str1 && (*str1 == *str2))
{
str1++;
str2++;
}
return *str1-*str2;
}
//////////////////////////////////////////////////////////////////////////
//功能爲比較兩個字符串前num個字符;
//當str1指向的字符串大於str2指向的字符串時,返回正數。
//當str1指向的字符串等於str2指向的字符串時,返回0。
//當str1指向的字符串小於str2指向的字符串時,返回負數。;
//////////////////////////////////////////////////////////////////////////
int mystrncmp(const char* str1,const char* str2,unsigned int num)
{
assert((str1 != NULL) && (str2 != NULL));
if (!num)
return 0;
while (--num && *str1 && (*str1 == *str2))
{
str1++;
str2++;
}
return *str1-*str2;
}
strcpy與strncpy原型
/*
功能爲拷貝字符串內容到目的串,把src所指向的內容拷貝到dest;
*/
char* mystrcpy(char* dest,const char* src)
{
assert((dest != NULL) && (src != NULL));
char* res = dest;
while(*dest++ = *src++)
{
NULL;
}
return res;
}
/*
功能爲拷貝字符串內容到目的串,把src所指向的內容的前num個字符拷貝到dest;
標準庫中返回指針不是以null即'\0'結束的,必須手動添加
*/
char* mystrncpy(char* dest,const char* src,unsigned int num)
{
assert((dest != NULL) && (src != NULL));
if (!num)
{
*dest = '\0';
return dest;
}
char* res = dest;
while(*dest++ = *src++)
{
if (--num == 0)
{
*dest = '\0';
break;
}
}
return res;
}
strspn與strcspn原型
//////////////////////////////////////////////////////////////////////////
//功能:在字符串str1中搜尋str2中所出現的字符
//說明:返回第一個出現的字符在s1中的下標值
//亦即在s1中出現而s2中沒有出現的子串的長度;
//////////////////////////////////////////////////////////////////////////
unsigned int mystrcspn ( const char * str1, const char * str2 )
{
assert((str1 != NULL) && (str2 != NULL));
// map有32個字節的大小,也就是256個bit,可把map堪稱一個2維數組[32][8]
unsigned char map[32] = {0};
// 每個ASCII碼(設爲c)有8bit,把它分成2部分,低3位構成下標j(通過c&7(2進製爲111));
// 高5位構成下標i(通過c>>3得到)。這樣在map[i][j]中置1表示字符存在;
while(*str2)
{
map[*str2 >> 3] |= (unsigned int)(1 << (*str2 & 7));
str2++;
}
map[0] |= 1;
unsigned int count = 0;
while(!(map[*str1 >> 3] & (unsigned int)(1 << (*str1 & 7))))
{
count++;
str1++;
}
return count;
}
//返回字符串中第一個不在指定字符串中出現的字符下標
//亦即第一個在s1中出現且s2中存在的子串的長度;
unsigned int mystrspn(char* str1,char* str2)
{
assert((str1 != NULL) && (str2 != NULL));
// map有32個字節的大小,也就是256個bit,可把map堪稱一個2維數組[32][8]
unsigned char map[32] = {0};
// 每個ASCII碼(設爲c)有8bit,把它分成2部分,低3位構成下標j(通過c&7(2進製爲111));
// 高5位構成下標i(通過c>>3得到)。這樣在map[i][j]中置1表示字符存在;
while(*str2)
{
map[*str2 >> 3] |= (unsigned int)(1 << (*str2 & 7));
str2++;
}
map[0] |= 0;
unsigned int count = 0;
while((map[*str1 >> 3] & (unsigned int)(1 << (*str1 & 7))))
{
count++;
str1++;
}
return count;
}
strlen原型
//////////////////////////////////////////////////////////////////////////
//功能爲返回字符串str的長度(不包括'\0');
//size_t strlen ( const char * str );
//////////////////////////////////////////////////////////////////////////
unsigned int mystrlen(const char* str)
{
assert(str != NULL);
unsigned int len = 0;
while(*str++)
{
len++;
}
return len;
}
strstr原型
//需找str字符串中出現strSearch字符串位置的指針。如果沒找到,則返回NULL,如果strSearch爲空,則返回str;
char* mystrstr(char* str,char* strSearch)
{
/*
int length1=strlen(str);
int length2=strlen(strSearch);
while(length1>=length2)
{
length1--;
if(!mystrncmp(str,strSearch,length2))//比較前n個字符串;
return str;
str++;
}
return NULL;
*/
char* b = strSearch;
if( *b == NULL )
{
return str;
}
char* a = NULL;
for( ; *str != NULL; str++)
{
if( *str != *b )
{
continue;
}
a = str;
while(1)
{
if( *b == NULL )
{
return str;
}
if( *a++ != *b++ )
{
break;
}
}
b = strSearch;
}
return NULL;
}
strpbrk
//在源字符串(str1)中找出最先含有搜索字符串(str2 )中的任一字符的位置並返回,若找不到則返回空指針;
//與mystrnspn的算法一樣,只是前者返回相同字符的指針位置,後者返回相同字符的個數;
char* mystrpbrk(char* str1,char* str2)
{
assert((str1 != NULL) && (str2 != NULL));
// map有32個字節的大小,也就是256個bit,可把map堪稱一個2維數組[32][8]
unsigned char map[32] = {0};
// 每個ASCII碼(設爲c)有8bit,把它分成2部分,低3位構成下標j(通過c&7(2進製爲111));
// 高5位構成下標i(通過c>>3得到)。這樣在map[i][j]中置1表示字符存在;
while(*str2)
{
map[*str2 >> 3] |= (unsigned int)(1 << (*str2 & 7));
str2++;
}
map[0] |= 1;
while(*str1)
{
// 如果有相同的字符則返回;
if( map[*str1 >> 3] & (1 << (*str1 & 7)) )
return str1++;
str1++;
}
return NULL;
}
經過一天的奮鬥,終於將這些理清楚了。再接再厲!
這些經常出現在面試題中,不能再輸在這上面了