#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main(){
char str1[] = "abcdefggggggg";
char str2[] = "bcdef";
char* p = NULL;
p = strstr(str1, str2)
puts(p);
system("pause");
return 0;
}
char* strstr (const char*, const char*);
strstr在第一个字符串中查找第二个字符串是否存在.找到后将首地址返回,没找到就返回NULL.
上面的代码在可以找到的情况下,是没有任何问题的,运行结果如下
但是,当无法在第一个字符串查找到第二个字符串的存在时,要返回NULL,所以当我们还用上面的代码去查找不存在的字符串时就会出现问题,比如
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main(){
char str1[] = "abcdefggggggg";
char str2[] = "acdef";
char* p = NULL;
p = strstr(str1, str2)
puts(p);
system("pause");
return 0;
}
运行结果如下:
所以我们对代码作出修改
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
//strstr如果找到了,就返回找到的首地址
//如果没找到就返回空
int main(){
char str1[] = "abcdefggggggg";
char str2[] = "bcdef";
char* p = NULL;
if (p = strstr(str1, str2)){
puts(p);
}
else {
printf("没找到!\n");
}
system("pause");
return 0;
}
对strstr的返回值进行判断,不为空则将首地址返回,为空就输出"没找到".
strstr的模拟实现
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <assert.h>
//模拟实现strstr
char* my_strstr(const char* str1, const char* str2){
char* p = (char*)str1;
char* s1 = (char*)str1;
char* s2 = (char*)str2;
assert(str1);
if (str2 == NULL){
return NULL;
}
while (*p){
s1 = p;
s2 = (char*)str2;
while (*s1 && *s2 && *s1 == *s2){
s1++;
s2++;
}
if (*s2 == '\0'){
return p;
}
p++;
}
}
int main(){
char str1[] = "abcdefggggggg";
char str2[] = "bcdef";
char* p = NULL;
if (p = my_strstr(str1, str2)){
puts(p);
}
else {
printf("没找到!\n");
}
system("pause");
return 0;
}