2014-11-24 3 views
1

strndup 또는 memcpy 또는 strncpy 등을 사용하여 문자열의 부분 문자열을 가져 오는 많은 솔루션을 보았습니다.함수를 사용하지 않고 C로 된 하위 문자열

이러한 함수를 사용하지 않고 하위 문자열을 가져 오는 방법이 있는지 궁금합니다. 불필요한 경우에도 마찬가지입니다.

편집 : 직접 기능을 만들려고했습니다. 문제가 무엇인지 기억이 나지 않지만 뭔가 잘못되어 결국 사용하지 않게되었습니다.

char *substring(char *str, int start, int length) { 
    char *s = malloc(sizeof(char)*(length+1)); 

    for(int i=start; i<start+length; i++) { 
     s[i-start] = str[i]; 
    } 
    s[length] = '\0'; 

    return s; 
} 
+3

젠장이와 C에서 할 수 있습니다 적절하게 구성된 'for'루프. – warrenm

+1

'YES!'그 함수를 사용하지 않고 문자열에서 부분 문자열을 찾는 방법은 여러 가지가 있습니다. –

+0

'OKAY! '그냥 시도했지만 그 함수를 사용하지 않고 완벽하게 작동하지 못했습니다. – Haxify

답변

2

strstr을 재 작성하는 데는 여러 가지 방법이 있습니다. 다음은 inch-worm 메서드를 사용하는 빠른 구현입니다. 포인터를 사용하여 substring의 시작 부분을 검색하고 string에있는 경우 substring의 모든 문자와 string의 해당 문자를 비교합니다. 모든 문자가 일치하면 하위 문자열을 찾은 다음 substring의 시작 부분에 대한 포인터를 string에 반환합니다.

문자가 테스트에 실패하면 stringsubstring에있는 첫 번째 문자와 일치하는 다른 문자가 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. 
관련 문제