작은숲:위키노트/C 언어 예제/strfind() 함수 만들기

큰숲백과, 나무를 보지 말고 큰 숲을 보라.
/**
 * Copyright (c) 2001,2002 Yoon, Hyunho <hhyoon@kldp.org>
 * http://mooo.org
 * ----------------------------------------------------------------------
 *
 * LICENSE
 *
 * This program is free software; you can redistribute it and/or
 * modify it under the terms of the GNU General Public License
 * as published by the Free Software Foundation; either version 2
 * of the License, or (at your option) any later version.
 *
 * This program is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU General Public License for more details.
 *
 * You should have received a copy of the GNU General Public License
 * along with this program; if not, write to the Free Software 
 * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
 */
#include <stdio.h>
#include <string.h>
/* 배열의 크기 */
#define MAX        81
/* 함수 원형 선언 */
char *strfind(char *src, char *target);
char *strfind2(char *src, char *target);
/* 메인 함수 시작 */
int main()
{    /* 원본 문자열 */
    char string[MAX] = "Welcome to Bitcamp! Do your best!";
    /* 찾을 문자열 */
    char str[MAX]    = "tc";
    /* strfind() 함수가 반환하는 값을 저장할 포인터 */
    char *pdest;
    /* 원본 문자열에서 찾은 문자열의 위치 */
    int  position;
    /* 형식 문자열 */
    char *fmt1 = "         1         2         3         4         5";
    char *fmt2 = "12345678901234567890123456789012345678901234567890";
    /* 원본 문자열 출력 */
    printf("Original string: %s\n", string);
    printf("Enter a string to search: ");
    /* gets() 함수를 이용해 문자열을 입력받는다. */
    gets(str);
    /* 칸 수를 확인하기 위한 형식 출력 */
    printf("String to be searched:\n");
    printf("\t%s\n\t%s\n", fmt1, fmt2);
    printf("\t%s\n\n", string);
    /**
     * strfind() 함수를 호출하여 원본 문자열에서 찾을 문자열을 찾는다.
     * 이 함수가 반환하는 주소는 원본 문자열 내에서 찾을 문자열의 ..
     * 시작 위치를 나타낸다.
     * 만약 못찾은 경우 NULL 포인터가 반환된다.
     */
    pdest = strfind(string, str);
    /* 원본 문자열 내에서 찾은 문자열의 시작 주소를 기반으로 ..
       위치를 계산한다. */
    position = pdest - string + 1;
    /* 문자열을 찾은 경우 */
    if (pdest != NULL)
        printf("\"%s\" found at position %d (address %08X).\n\n",
            str, position, pdest);
    /* 문자열을 찾지 못한 경우 */
    else
        printf("\"%s\" not found\n", str);
    return 0;
}/**
 * 이 함수는 하나의 문자열 내에서 다른 문자열이 있는지 검사하는 함수이다.
 * 만약 원본 문자열 내에 찾을 문자열이 존재한다면, 원본 문자열 내에서 ..
 * 찾을 문자열이 시작하는 위치의 주소를 반환한다.
 */
char *strfind(char *src, char *target)
{    int i, j;
    int len_src, len_target;
    char *ptr;
    /* 두 문자열의 길이를 구한다. */
    for (len_src = 0, ptr = src; *ptr; ptr++, len_src++) ;
    for (len_target = 0, ptr = target; *ptr; ptr++, len_target++) ;
    /**
     * 원본 문자열의 길이에서 찾을 문자열의 길이를 뺀 만큼 반복문을 수행한다.
     * 이는 생각해보면 아주 당연한 것이다. 원본 문자열의 길이가 찾을 문자열의 ..
     * 길이보다 작다면 이것은 원본 문자열 안에 찾을 문자열이 없다는 말이 된다.
     * 또한, 찾을 문자열의 길이보다 앞으로 확인할 원본 문자열의 길이가 작다면 ..
     * 이 또한 그 안에 찾을 문자열이 없다는 말이 된다.
     */
    for (i = 0; i < len_src - len_target; i++) {
        /* 찾을 문자열의 길이만큼 반복문을 수행한다. */
        for (j = 0; j < len_target; j++) {
            /* 만약 두 문자열의 위치의 글자가 다르다면 ..
             * 찾을 문자열이 아니므로 break 한다. */
            if (src[j + i] != target[j])
                break;
        }
        /**
         * 이 조건문을 만날 수 있는 경우는 두 가지 이다.
         * 첫번째, 앞의 for 문을 다 수행한 경우 ..
         * 두번째, 앞의 for 문에서 break 되어 빠져나오는 경우 ..
         * 이 두 경우 중 첫번째 경우가 원본 문자열 내에서 ..
         * 문자열을 찾은 경우가 된다.
         * 따라서, 원본 문자열의 시작 주소에서 i 만큼 떨어진 곳의,
         * 즉 원본 문자열 내에서 찾을 문자열이 시작하는 곳의 ..
         * 주소를 반환한다.
         */
        if (j == len_target)
            return (src + i);
    }
    /**
     * 이 경우를 만나는 경우는 앞의 return 문을 만나지 못했기 때문이다.
     * 즉, 원본 문자열 내에서 찾을 문자열을 찾지 못했다는 말이 된다.
     * 그래서, 찾지 못했다는 의미로 NULL 포인터를 반환한다.
     */
    return NULL;
}/**
 * 이 함수는 하나의 문자열 내에서 다른 문자열이 있는지 검사하는 함수이다.
 * 만약 원본 문자열 내에 찾을 문자열이 존재한다면, 원본 문자열 내에서 ..
 * 찾을 문자열이 시작하는 위치의 주소를 반환한다.
 *
 * 이 함수가 위 함수와 다른 점은 이 함수에서는 string.h에서 제공되는 ..
 * C 언어의 표준 함수들을 이용하고 있다는 점이다.
 * 그렇게 함으로 좀더 간결하게 strfind() 함수를 만들 수 있다.
 */
char *strfind2(char *src, char *target)
{    int i;
    int len_src, len_target;
    char temp[MAX];
    /* 두 문자열의 길이를 구한다. */
    len_src = strlen(src);
    len_target = strlen(target);
    for (i = 0; i < len_src - len_target; i++) {
        /* sprintf() 함수를 이용해서 src 문자열의 i 번째 이후의 문자열을 ..
         * 임시 문자열로 만든다. */
        sprintf(temp, "%s", src + i);
        /* strncmp() 함수는 첫번째 문자열과 두번째 문자열의 세번째 글자까지만 ..
         * 같은지 검사하는 함수이다. */
        if (strncmp(temp, target, len_target) == 0)
            return (src + i);
    }
    /* 문자열의 찾지 못한 경우는 NULL 포인터를 반환한다. */
    return NULL;
}
이 작은숲 문서의 출처는 위키노트의 위키노트/C 언어 예제/strfind() 함수 만들기 문서입니다.