1

这是我制作的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);
}
4

10 回答 10

4

这就是标准要说的全部内容:

7.21.5.7strstr功能

概要

 #include <string.h> 
char *strstr(const char *s1, const char *s2); 

描述

strstr 函数定位 s2 指向的字符串中的字符序列(不包括终止空字符)在 s1 指向的字符串中的第一次出现。

退货

strstr 函数返回一个指向已定位字符串的指针,如果未找到该字符串,则返回一个空指针。如果 s2 指向长度为零的字符串,则函数返回 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);
}
于 2010-09-09T22:16:21.220 回答
2

你的代码有问题。鉴于:

char *haystack = "fififi-trixabelle";
char *needle = "fifi-trixabelle";

fstrset(haystack, needle)返回错误返回NULL

于 2010-09-10T00:48:47.333 回答
1

除了 caf 提到的错误之外,还有其他错误:

1) 未初始化 b. 如果s指向'\0',则可以到达右大括号,省略任何返回语句。

2) 如果字符匹配到指向的字符串的结尾,s则不检查指向的字符串是否也t结束。

于 2010-09-10T01:05:18.093 回答
0

这是做什么的?它看起来像胡言乱语。为什么要添加指针,并将它们与整数混合?对不起,但整个事情没有意义。

回答你的问题,我不这么认为。但是如果你编译它并运行它,那么是的。

好的,当您仔细查看代码时,您的代码确实有意义。是的,如果这就是标准代码的意思,它看起来确实会编译。

于 2010-09-09T22:13:56.407 回答
0
inline char* strstr(char* __s1, const char* __s2)
{
    return __builtin_strstr(const_cast<const char*>(__s1), __s2); 
}
于 2010-09-09T22:15:34.857 回答
0

快速阅读似乎表明代码有效(可能有一些边缘情况不起作用)。你告诉我们,它有效吗?

但为什么要这样做?只需调用 strstr

于 2010-09-09T22:18:39.953 回答
0

没有“标准代码”,只有标准结果。

标准 C 库中的任何实现都不太可能使用数组索引,因此您的代码不太可能与任何实现逐行匹配。

于 2010-09-09T22:38:28.610 回答
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);
 }
}
于 2010-09-10T01:15:31.160 回答
0

没有“标准代码”,只有标准结果。

标准 C 库中的任何实现都不太可能使用数组索引,因此您的代码不太可能与行实现中的任何实现相匹配。

于 2020-04-05T03:20:30.807 回答
-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;}
    }
于 2014-02-10T18:10:59.957 回答