簡體   English   中英

c語言通過指針strstr

[英]strstr through pointers in c language

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

這就是標准要說的所有內容:

7.21.5.7 strstr函數

概要

 #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);
}

你的代碼有問題。 鑒於:

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

fstrset(haystack, needle)返回錯誤地返回NULL

除了 caf 提到的錯誤之外,還有其他錯誤:

1) 未初始化 b. 如果s指向'\\0' ,則可以到達右大括號,省略任何 return 語句。

2) 如果字符匹配到s指向的字符串的末尾,則不檢查t指向的字符串是否也結束。

這有什么作用? 它看起來像胡言亂語。 為什么要添加指針,並將它們與整數混合? 對不起,但整件事沒有意義。

\n

為了回答你的問題,我不這么認為。 但是如果你編譯它並運行它,那么是的。

好的,當您仔細查看代碼時,您的代碼確實有意義。 是的,它看起來確實可以編譯,如果這就是您所說的標准代碼的意思。

inline char* strstr(char* __s1, const char* __s2)
{
    return __builtin_strstr(const_cast<const char*>(__s1), __s2); 
}

快速通讀似乎表明代碼有效(可能存在不起作用的邊緣情況)。 你告訴我們,它有效嗎?

但是為什么要這樣做呢? 只需調用 strstr

沒有“標准代碼”,只有標准結果。

標准 C 庫中的任何實現都不太可能使用數組索引,因此您的代碼不太可能逐行詳細地匹配任何實現。

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);
 }
}

沒有“標准代碼”,只有標准結果。

標准 C 庫中的任何實現都不太可能使用數組索引,因此您的代碼不太可能與行實現中的任何實現相匹配。

    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;}
    }

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM