C言語関数のstr()の分析と実現について
元ネタ:char*str(const char*str 1、const char*str 2);include<string.h>は、str 2文字列がstr 1文字列で初めて出現する位置(str 2の列の終端符を含まない)を探し出す。この位置のポインタを返します。見つからない場合は、空のポインタを返します。Returns a pointer to the first occurrence of strearch in str,or NULL if strearch does not appar in str.Ifstr Search points to a string ofゼロlength,the function returns str.
#include <stdio.h>
#include <conio.h>
#include <string.h>
#include <stdlib.h>
#pragma warning (disable:4996)
char *mystrstr(char *s1,char *s2);
int main(void)
{
char *s="Golden Global View";
char *l="ob"; //char *l=""
char *p;
system("cls");
p=mystrstr(s,l);
if (p!=NULL)
{
printf("%s
",p);
}
else
{
printf("Not Found!
");
}
getch();
return 0;
}
/*FROM */
char *mystrstr(char *s1,char *s2)
{
int n;
if (*s2) //
{
while(*s1)
{
for (n=0;*(s1+n)==*(s2+n);n++)
{
if (!*(s2+n+1)) // '\0'
{
return (char*)s1;
}
}
s1++;
}
return NULL;
}
else
{
return (char*)s1;
}
}
別の実装:
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;
}
もう一つの実装:
#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;
}