程序员面试宝典上有道题目:
请写写一个函数模拟c++中的strstr()函数。strstr() 函数搜索一个字符串在另一个字符串中的第一次出现。找到所搜索的字符串,则该函数返回第一次匹配的字符串的地址;如果未找到所搜索的字符串,则返回NULL。
const char * strstr1(const char *string,const char * strCharSet)
{
for(int i=0;string[i]!='\0';i++)
{
int j=0;
int temp=i;
if(string[i]==strCharSet[j])
{
while(string[i++]==strCharSet[j++])
{
if(strCharSet[j]=='\0')
return &string[i-j];
}
i=temp;
}
}
return NULL;
}
上述代码中,是在字符串string中搜索字符串strCharSet。思路是,外层for循环遍历string,每次遍历中,把string的每一个元素和strCharSet的起始元素进行比较,若不相同则比较下一个元素;若相同把此时string元素的下标赋值给一个临时变量temp,从这个相同的元素起,内层while循环继续比较string和strCharSet的元素,直到strCharSet中遇到‘\0’。若在内层循环比较的过程中,有元素不同,则跳出内层while循环,执行外层for循环。
以下代码来自百度百度:
char *strstr2(char*s1,char*s2)
{
if(*s1==0)//s1为空字符串
{
if(*s2)//s2不为空字符串
return (char*)NULL;//空指针
return (char*)s1;//s2为空字符串
}
while(*s1)
{
int i=0;
while(1)
{
if(s2[i]==0)
return s1;
if(s2[i]!=s1[i])
break;
i++;
}
s1++;
}
return (char*)NULL;
}
上述代码具有查错功能。
当s1为空字符串,s2不为空字符串,函数返回NULL。
当s1为空字符串,s2为空字符串,函数返回s1的地址。
外层while循环没进行一次,s1的值加1。
内层while循环实现比较字符换元素的功能,当元素相同的时候,继续比较下一个元素直到
当s2达到‘\0’时,则返回此时s1的值。一旦元素不同,则使用break语句跳出内层while循环。
上述两种strstr函数的写法虽然形式上看来有些不同,但是分析下来,整个思路是相同,万变不离其宗。
测试函数:
int main()
{
char *string="Hello world!";
cout<<string<<endl;
cout<<strstr("Hello world!","world")<<endl;
cout<<strstr1("Hello world!","world")<<endl;
cout<<strstr2("Hello world!","world")<<endl;
return 0;
}
测试结果: