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 関数は、見つかった文字列へのポインターを返すか、文字列が見つからない場合は null ポインターを返します。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'は、return ステートメントを省略して閉じ中括弧に到達する可能性があります。

2) が指す文字列の最後まで文字が一致するs場合、が指す文字列も終了するかどうかはチェックされtません。

于 2010-09-10T01:05:18.093 に答える
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 ライブラリの実装で配列インデックスが使用されることはほとんどないため、コードが行単位の詳細で実装と一致することはまずありません。

于 2010-09-09T22:38:28.610 に答える
0

これは何をしますか?ぐちゃぐちゃに見えます。ポインターを追加して、それらを int と混合するのはなぜですか? 申し訳ありませんが、すべて意味がありません。

そして、あなたの質問に答えるために、私はそうは思いません。しかし、コンパイルして実行すれば、はい。

さて、あなたのコードは、よく見ると理にかなっています。はい、それが標準コードの意味であれば、コンパイルされるように見えます。

于 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 に答える
-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 に答える