strstr
을 재 작성하는 데는 여러 가지 방법이 있습니다. 다음은 inch-worm
메서드를 사용하는 빠른 구현입니다. 포인터를 사용하여 substring
의 시작 부분을 검색하고 string
에있는 경우 substring
의 모든 문자와 string
의 해당 문자를 비교합니다. 모든 문자가 일치하면 하위 문자열을 찾은 다음 substring
의 시작 부분에 대한 포인터를 string
에 반환합니다.
문자가 테스트에 실패하면 string
의 substring
에있는 첫 번째 문자와 일치하는 다른 문자가 string
이 모두 소모 될 때까지 찾습니다.
이 inplemented 수 있습니다 아마도 몇 가지 더 확인이 있지만,이 예제는 시작할 수 있어야합니다
#include <stdio.h>
#include <stdlib.h>
char *strstr2 (char *str, char *sub)
{
if (!str || !sub) return NULL; /* validate both strings */
char *p = NULL; /* general pointer */
char *sp = NULL; /* substring pointer */
char *rp = NULL; /* return pointer */
char matched = 0; /* matched flag */
size_t szstr = 0; /* string length */
size_t szsub = 0; /* substring length */
p = sub;
while (*p++) szsub++; /* strlen of substr */
p = str;
while (*p++) szstr++; /* strlen of str */
if (szsub > szstr) return NULL; /* szstr < szsub - no match */
p = str;
while (p < (p + szstr - szsub + 1))
{
while (*p && *p != *sub) p++; /* find start of sub in str */
if ((str + szstr) == p) return NULL; /* if end reached - no sub */
rp = p; /* save return pointer */
sp = sub; /* set sp to sub */
matched = 1; /* presume will match */
while (*sp) /* for each in substring */
if (*p++ != *sp++) { /* check if match fails */
matched = 0; /* if failed, no match */
break; /* break & find new start */
}
if (matched) /* if matched, return ptr */
return rp; /* to start of sub in str */
}
return NULL; /* no match, return NULL */
}
int main() {
char *string = NULL;
char *substr = NULL;
char *begin = NULL;
printf ("\nEnter string : ");
scanf ("%m[^\n]%*c", &string);
printf ("\nEnter substr : ");
scanf ("%m[^\n]%*c", &substr);
if ((begin = strstr2 (string, substr)) != NULL)
printf ("\nSubstring found beginning at : %s\n\n", begin);
else
printf ("\nSubstring NOT in string.\n\n");
if (string) free (string);
if (substr) free (substr);
return 0;
}
출력 : 모든 근처
$ ./bin/strstr
Enter string : This is the full string or "haystack".
Enter substr : g or "
Substring found beginning at : g or "haystack".
$ ./bin/strstr
Enter string : This is the full string or "haystack".
Enter substr : g or '
Substring NOT in string.
젠장이와 C에서 할 수 있습니다 적절하게 구성된 'for'루프. – warrenm
'YES!'그 함수를 사용하지 않고 문자열에서 부분 문자열을 찾는 방법은 여러 가지가 있습니다. –
'OKAY! '그냥 시도했지만 그 함수를 사용하지 않고 완벽하게 작동하지 못했습니다. – Haxify