關(guān)于C語(yǔ)言函數(shù)strstr()的分析以及實(shí)現(xiàn)
更新時(shí)間:2013年07月11日 11:42:24 作者:
以下是對(duì)C語(yǔ)言中strstr()函數(shù)的使用進(jìn)行了詳細(xì)的分析介紹,需要的朋友可以參考下
原型:char *strstr(const char *str1, const char *str2);
#include<string.h>
找出str2字符串在str1字符串中第一次出現(xiàn)的位置(不包括str2的串結(jié)束符)。返回該位置的指針,如找不到,返回空指針。
Returns a pointer to the first occurrence of strSearch in str, or NULL if strSearch does not appear in str. IfstrSearch points to a string of zero 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\n",p);
}
else
{
printf("Not Found!\n");
}
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)) //查找的下一個(gè)字符是否為'\0'
{
return (char*)s1;
}
}
s1++;
}
return NULL;
}
else
{
return (char*)s1;
}
}
另一個(gè)實(shí)現(xiàn):
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;
}
又一個(gè)實(shí)現(xiàn):
#include <iostream>
#include <string>
using namespace std;
//c語(yǔ)言實(shí)現(xiàn)strstr
const char* isSub(const char* str, const char *subs){
//特殊情況
if(!*subs)
return str;
const char* tmp=str;
while (*tmp!='\0')
{
//用于每次將父串向后移動(dòng)一個(gè)字符
const char* tmp1=tmp;
//記錄子串地址
const char* sub1=subs;
while (*sub1!='\0'&&*tmp1!='\0')
{
//若不相等則跳出,將父串后移一個(gè)字符
if (*sub1!=*tmp1)
break;
//若相等且子串下一個(gè)字符是末尾則是這個(gè)父串的子串
if (*sub1==*tmp1&&*(sub1+1)=='\0')
return tmp;
//若相等則繼續(xù)比較下一個(gè)字符
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;
}
#include<string.h>
找出str2字符串在str1字符串中第一次出現(xiàn)的位置(不包括str2的串結(jié)束符)。返回該位置的指針,如找不到,返回空指針。
Returns a pointer to the first occurrence of strSearch in str, or NULL if strSearch does not appear in str. IfstrSearch points to a string of zero length, the function returns str.
復(fù)制代碼 代碼如下:
#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\n",p);
}
else
{
printf("Not Found!\n");
}
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)) //查找的下一個(gè)字符是否為'\0'
{
return (char*)s1;
}
}
s1++;
}
return NULL;
}
else
{
return (char*)s1;
}
}
另一個(gè)實(shí)現(xiàn):
復(fù)制代碼 代碼如下:
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;
}
又一個(gè)實(shí)現(xiàn):
復(fù)制代碼 代碼如下:
#include <iostream>
#include <string>
using namespace std;
//c語(yǔ)言實(shí)現(xiàn)strstr
const char* isSub(const char* str, const char *subs){
//特殊情況
if(!*subs)
return str;
const char* tmp=str;
while (*tmp!='\0')
{
//用于每次將父串向后移動(dòng)一個(gè)字符
const char* tmp1=tmp;
//記錄子串地址
const char* sub1=subs;
while (*sub1!='\0'&&*tmp1!='\0')
{
//若不相等則跳出,將父串后移一個(gè)字符
if (*sub1!=*tmp1)
break;
//若相等且子串下一個(gè)字符是末尾則是這個(gè)父串的子串
if (*sub1==*tmp1&&*(sub1+1)=='\0')
return tmp;
//若相等則繼續(xù)比較下一個(gè)字符
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;
}
您可能感興趣的文章:
相關(guān)文章
C語(yǔ)言詳解無(wú)頭單向非循環(huán)鏈表各種操作方法
無(wú)頭單向非循環(huán)鏈表:結(jié)構(gòu)簡(jiǎn)單,一般不會(huì)單獨(dú)用來(lái)存數(shù)據(jù)。實(shí)際中更多是作為其他數(shù)據(jù)結(jié)構(gòu)的子結(jié)構(gòu),如哈希桶、圖的鄰接表等等。另外這種結(jié)構(gòu)在筆試面試中出現(xiàn)很多2022-04-04
C++數(shù)據(jù)結(jié)構(gòu)繼承的概念與菱形繼承及虛擬繼承和組合
今天我要給大家介紹C++中更深入的內(nèi)容了。C++這門(mén)語(yǔ)言為了使代碼不冗余,做了些什么操作呢?C++的繼承就很好地實(shí)現(xiàn)了類層次的代碼復(fù)用,今天我就要來(lái)和大家好好聊一聊它了2022-02-02
Qt?自定義屬性Q_PROPERTY不顯示float類型的解決
這篇文章主要介紹了Qt?自定義屬性Q_PROPERTY不顯示float類型的問(wèn)題及解決,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-11-11
Visual Studio新建類從默認(rèn)internal改為public
本文將介紹如何將Visual Studio中的internal修飾符更改為public,以實(shí)現(xiàn)更廣泛的訪問(wèn)和重用,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2023-09-09
C語(yǔ)言結(jié)構(gòu)體(struct)的詳細(xì)講解
C語(yǔ)言中,結(jié)構(gòu)體類型屬于一種構(gòu)造類型(其他的構(gòu)造類型還有:數(shù)組類型,聯(lián)合類型),下面這篇文章主要給大家介紹了關(guān)于C語(yǔ)言結(jié)構(gòu)體(struct)的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),需要的朋友可以參考下2022-03-03
簡(jiǎn)單總結(jié)C語(yǔ)言中各種類型的指針的概念
這篇文章主要簡(jiǎn)單總結(jié)了C語(yǔ)言中各種類型的指針的概念,指針可以說(shuō)是C語(yǔ)言本身所具有的最大特性,平時(shí)根據(jù)不同使用場(chǎng)合習(xí)慣地將其簡(jiǎn)單分類,需要的朋友可以參考下2016-03-03
C實(shí)現(xiàn)與 uint64_t 相同功能的類
本文給大家分享的是筆者實(shí)現(xiàn)的仿uint64_t的類,可以用在不支持uint64_t的平臺(tái)上,雖然現(xiàn)在功能還不完善,但是還是分享給大家,也算是給大家一個(gè)思路吧。2015-12-12

