![](/img/trans.png)
[英]Is this right approach to write the code of strstr through pointers in c?
[英]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
指向的字符串是否也結束。
這有什么作用?
它看起來像胡言亂語。
為什么要添加指針,並將它們與整數混合?
對不起,但整件事沒有意義。
為了回答你的問題,我不這么認為。
但是如果你編譯它並運行它,那么是的。
好的,當您仔細查看代碼時,您的代碼確實有意義。 是的,它看起來確實可以編譯,如果這就是您所說的標准代碼的意思。
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.