常见字符串函数实现
1、strstr
strstr(str1,str2)
函数用于判断字符串str2是否是str1的子串(hello,ll----->2)
KMP算法---->字符串单模匹配的模型
void getNext(int* next, const string& s)
{
int j = 0;
next[0] = 0;
for(int i = 1; i < s.size(); i++) {
while (j > 0 && s[i] != s[j]) {
j = next[j - 1];
}
if (s[i] == s[j]) {
j++;
}
next[i] = j;
}
}
int strStr(string haystack, string needle) {
if(needle.size() == 0)return 0;
int next[needle.size()];
getNext(next, needle);
int j = 0;
for(int i = 0; i < haystack.size(); i++)
{
while(j > 0 && haystack[i] != needle[j])
{
j = next[j - 1];
}
if(needle[j] == haystack[i])j++;
if(j == needle.size())
return(i - needle.size() + 1);
}
return -1;
}
2、strcpy
把从strsrc地址开始且含有’\0’结束符的字符串复制到以strdest开始的地址空间,返回值的类型为char*。
char *strcpy( char *strDest, const char *strSrc )
{
assert( (strDest != NULL) && (strSrc != NULL) );
char *address = strDest;
while( (*strDest++ = *strSrc++) != '\0');
return address;
3、strlen
计算给定字符串的长度
int strlen( const char *str )
{
assert( strt != NULL ); //断言字符串地址非0
int len;
while( (*str++) != '\0' )
{
len++;
}
return len;
}
4、strcat
作用是把src所指字符串添加到dest结尾处
// strcat的实现
char * strcat(char * dest, const char * src)
{
assert(dest && src);
char * ret = dest;
// 找到dest的'\0'结尾符
while(*dest)
{
dest++;
}
// 拷贝(while循环退出时,将结尾符'\0'也做了拷贝)
while(*dest++ = *src++){}
return ret;
}
5、strcmp
比较两个字符串设这两个字符串为str1,str2,若str1==str2,则返回零;若str1<str2,则返回负数;若str1>str2,则返回正数
// strcmp的实现
int strcmp(const char * str1, const char * str2)
{
assert(str1 && str2);
// 找到首个不相等的字符
while(*str1 && *str2 && (*str1==*str2))
{
str1++;
str2++;
}
return *str1 - *str2;
}