본문으로 이동

미디어위키 1.45 안정화가 거의 끝났습니다. 다만 Flow 확장 기능 관련 이슈가 있어서 대체하는 작업을 수행할 계획입니다.

  1. 큰숲백과:청사진에서 위키 발전의 대략적인 방향성을 제시했습니다. 의견이 있으신 분은 큰숲백과토론:청사진에서 의견을 남겨주시면 좋겠습니다.
  2. 기능상의 오류로 지원하지 않고 있는 기능에 대해서는 큰숲백과토론:이슈 트래커에 요약했습니다. 참고하시기 바랍니다.
  3. 데이터베이스 덤프 받고싶으신 분은 큰숲백과 가입 후에 사용자토론:Bigforest에 의견 남겨주시면 ftp 주소, 계정, 비밀번호를 특수:EmailUser를 통해서 공개할 예정입니다.

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

큰숲백과, 나무를 보지 말고 큰 숲을 보라.
Utolee90 (토론 | 기여)님의 2021년 3월 28일 (일) 12:51 판 (문자열 찾아 바꾸기 - "<source" 문자열을 "<syntaxhighlight" 문자열로)

<syntaxhighlight lang="c"> /**

* 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.
*/
  1. include <stdio.h>
  2. include <string.h>

/* 배열의 크기 */

  1. 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;

}</source>

이 작은숲 문서의 출처는 위키노트의 위키노트/C 언어 예제/strfind() 함수 만들기 문서입니다.