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