- C实现strstr
- 1111111111111111111111111111
- #include <iostream>
- #include <string>
- using namespace std;
- //c语言实现strstr
- const char* isSub(const char* str, const char *subs){
- //特殊情况
- if(!*subs)
- return str;
- const char* tmp=str;
- while (*tmp!='\0')
- {
- //用于每次将父串向后移动一个字符
- const char* tmp1=tmp;
- //记录子串地址
- const char* sub1=subs;
- while (*sub1!='\0'&&*tmp1!='\0')
- {
- //若不相等则跳出,将父串后移一个字符
- if (*sub1!=*tmp1)
- break;
- //若相等且子串下一个字符是末尾则是这个父串的子串
- if (*sub1==*tmp1&&*(sub1+1)=='\0')
- return tmp;
- //若相等则继续比较下一个字符
- if (*sub1==*tmp1)
- {
- sub1++;
- tmp1++;
- }
- }
- tmp++;
- }
- return NULL;
- }
- int main(){
- char* str1="ababcdddb";
- char* str="";
- const char *res=isSub(str1,str);
- if (res!=NULL)
- {
- cout << res << endl;
- }
- else
- cout << "null" << endl;
- //cout << isSub(str1,str) << endl;
- return 0;
- }
2222222222222222222222222222222222222222
- #include <stdio.h>
- const char *my_strstr(const char *str, const char *sub_str)
- {
- for(int i = 0; str[i] != '\0'; i++)
- {
- int tem = i; //tem保留主串中的起始判断下标位置
- int j = 0;
- while(str[i++] == sub_str[j++])
- {
- if(sub_str[j] == '\0')
- {
- return &str[tem];
- }
- }
- i = tem;
- }
- return NULL;
- }
- int main()
- {
- char *s = "1233345hello";
- char *sub = "345";
- printf("%s\n", my_strstr(s, sub));
- return 0;
- }
3333333333333333333333333333333333333333333333333
这个程序的风格、算法、技巧都中规中矩,简洁、明了,感觉就是典型的 C 程序。
/* Written by Philippe De Muyter <phdm@macqel.be>. */ char * strstr (buf, sub) register char *buf; register char *sub; { register char *bp; register char *sp; if (!*sub) return buf; while (*buf) { bp = buf; sp = sub; do { if (!*sp) return buf; } while (*bp++ == *sp++); buf += 1; } return 0; }