这是strstr我做的标准代码????
char* fstrset(char *s,char *t)
{
int b, i=0,j=0;
while(*(s+i)!='\0')
{
if(*(t+j)=='\0')
break;
else if(*(s+i)==*(t+j))
{
i++;j++;b=1;
}
else
{ i++;b=0;j=0;
}
}
if(b==0)
return((char*)NULL);
else if(b==1)
return(s+i-j);
}
答案 0 :(得分:4)
这是所有关于它的标准:
7.21.5.7
strstr
函数概要
#include <string.h> char *strstr(const char *s1, const char *s2);
描述
strstr函数定位第一个 在指向的字符串中出现 字符序列的s1 (不包括终止空值 字符串指向的字符串 S2。
返回
strstr功能 返回指向找到的指针 字符串,如果是,则为空指针 找不到字符串。如果s2指向a 字符串长度为零,函数 返回s1。
所以,看起来你在参数上缺少const
个限定符。
至于样式,请注意*(ptr+index)
可以替换为ptr[index]
,而size_t
是用于索引指针的最佳类型。
至于实现它的常用方式,请与GCC的代码进行比较:
char *
strstr (const char *s1, const char *s2)
{
const char *p = s1;
const size_t len = strlen (s2);
for (; (p = strchr (p, *s2)) != 0; p++)
{
if (strncmp (p, s2, len) == 0)
return (char *)p;
}
return (0);
}
答案 1 :(得分:2)
您的代码有问题。给出:
char *haystack = "fififi-trixabelle";
char *needle = "fifi-trixabelle";
fstrset(haystack, needle)
返回错误返回NULL
。
答案 2 :(得分:1)
除了caf提到的bug还有其他:
1)未初始化的b。如果s
指向'\0'
,则可能会达到右括号,省略任何返回语句。
2)如果字符与s
指向的字符串的末尾匹配,则不检查t
指向的字符串是否也结束。
答案 3 :(得分:0)
这是做什么的?看起来像胡言乱语。为什么要添加指针,并将它们与整数混合?对不起,但整件事没有意义。
为了回答你的问题,我不这么认为。但是如果你编译它并且它运行,那么是。
好的,当你仔细观察时,你的代码确实有意义。是的,它确实看起来会编译,如果这就是标准代码的含义。
答案 4 :(得分:0)
inline char* strstr(char* __s1, const char* __s2)
{
return __builtin_strstr(const_cast<const char*>(__s1), __s2);
}
答案 5 :(得分:0)
快速阅读似乎表明代码有效(可能有边缘情况不起作用)。你告诉我们,它有用吗?
但为什么呢?只需调用strstr
答案 6 :(得分:0)
没有'标准代码',只有标准结果。
标准C库中的任何实现都不太可能使用数组索引,因此您的代码不太可能与逐行详细信息中的任何实现匹配。
答案 7 :(得分:0)
char* fstrstr(char *s1,char *s2)
{
int i=0,flag=0;
char *s4,*s3;
// s4 for retaining the value of s2
s4 = s2;
while(*s1 != '\0' && *s2 != '\0')
{
if(*s1 == *s2)
{
*(s3+i) = *s1;
s2++;
s1++;
i++;
flag = 1;
}
else
{
i = 0;
s1++;
// Initialize s2 again from its address
s2 = s4;
flag = 0;
}
}
if(flag == 1)
{
while(*s1 != '\0')
{
*(s3+i) = *s1;
i++;
s1++;
}
*(s3+i) = '\0';
}
if(flag == 1)
return (s3);
if(flag==0)
{
*s3 = NULL;
return (s3);
}
}
答案 8 :(得分:0)
没有“标准代码”,只有标准结果。
标准C库中的任何实现都不太可能使用数组索引,因此您的代码不太可能与行实现中的任何实现匹配。
答案 9 :(得分:-1)
char *strstr(const char *s1, const char *s2) {
char *a = s1, *b = s2;
for (;;)
if (!*b) return (char *)s1;
else if (!*a) return NULL;
else if (*a++ != *b++) {a = ++s1; b = s2;}
}