3.28(수) strstr, strtok 함수

from Study/C언어 2007/03/28 18:38 view 38669

함수 개요

#include <string.h>

char *strtok( char *str, const char *set);

char *strstr( const char *src, const char *sub);


참고 : 2007/11/29 - [Study/C언어] - 문자열 함수의 구현

strstr 함수는 표준 C에서 처음 도입한 함수다. 이는 문자열 str 안에서 문자열 sub가 처음으로 나오는 위치를 찾아 해당 위치를 가리키는 포인터를 반환한다. 문자열 sub가 문자열 src에 한 번도 나오지 않는 경우에는 널 포인터를 반환한다.

strtok 함수는 문자열 str을 문자열 set에 나온 문자로 구분되는 토큰으로 나눌 때 사용한다. 각각의 토큰을 분리하기 위해 strtok 함수를 여러 번 호출하며, 도중에 문자열 set의 내용을 바꿀 수 있다. strtok 함수를 처음 호출할 때는 str에 문자열을 제공하며, 그 뒤에 이어지는 호출에서는 첫 번째 인자로 널 포인터를 주게 된다. 그러면 strtok함수는 이전에 찾은 토큰의 뒷부분부터 이어 검색을 진행한다.(strtok 함수를 사용해서 문자열 안의 토큰을 검색하는 과정에서 처음 제공된 문자열 str을 도중에 수정하면 안 된다.)

과정을 더 자세히 설명하면, 매개 변수 str에 널 포인터가 제공되지 않으면, strtok 함수는 문자열 str에서 set 에 존재하는 모든 문자를 건너뛰게 된다. 만약 문자열 str이 문자열 set의 문자로만 구성되어 있는 경우, strtok 함수는 토큰을 찾을 수 없기에 결과로 널 포인터를 반환한다. 이때 내부적으로 상태를 저장하기 위해 사용하는 포인터는 널 포인터로 설정된다. 문자열 str에 문자열 set에 나오지 않는 문자가 있는 경우, 내부 상태 포인터가 str에서 해당 문자를 가리키게 되고, str로 널 포인터가 제공된 것처럼 함수 실행이 계속된다.

str과 내부 상태 포인터 모두가 널 포인터인 경우, strtok 함수는 널 포인터를 반환하고 내부 상태 포인터는 널 포인터로 남는다.(이는 모든 토큰을 찾은 이후에 추가로 strtok 함수가 호출되는 경우를 위해서다.) str 이 널 포인터고 내부 상태 포인터가 널 포인터가 아닌 경우, 함수는 내부 상태 포인터가 가리키는 위치부터 시작해서 처음 제공된 str의 나머지 부분에서 set에 포함된 문자를 찾게 되고, 그와 같은 문자를 찾으면 해당 문자를 널 문자로 덮어쓴다. 함수의 결과로는 내부 상태 포인터의 값을 반환하고, 반환 이후에 내부 상태 포인터의 값은 저장된 널 문자 바로 뒤의 문자를 가리키도록 수정된다. 그러한 문자를 찾지 못하는 경우, strtok 함수는 내부 상태 포인터의 값을 반환하고 내부 상태 포인터를 널 포인터로 설정한다.

/*
다음프로그램은표준입력스트림으로부터문자열을입력받아strtok 함수를통해입력받은
라인을단어단위로나누어표준스트림으로출력한다. 이때단어는공백, 쉼표, 마침표, 인용부호,
물음표로구분된다고가정한다.
*/


예제 1.

#include <stdio.h>
#include <string.h>

int main() { char  hp[] = "080)(010)1234-4567";
    char  *p;
                  
    p = strtok( hp, "-()" );

    while( p )
    {
        printf("%s\t", p);
        p = strtok( 0, "-()");
    }

    printf("\n");

    return 0;
}

예제 2.


#include <stdio.h>
#include <string.h>

#define LINELENGTH 80
#define SEPCHARS " .,?\"\n"

int main(void)
{
   
char line[LINELENGTH];
   
char *word;

   
while(1)
    {
        printf(
"\nNext line? (empty line to quit)\n");
        fgets(line, LINELENGTH, stdin);
       
if(strlen(line) <= 1)
           
break;              //프로그램종료
        printf("That line contains these words: \n");
        word = strtok(line, SEPCHARS);              
//첫번째단어를찾음
        while(word != NULL)
        {
            printf(
"\"%s\"\n", word);
            word = strtok(
NULL, SEPCHARS);   //다음단어를찾음
        }
    }
}

Tag |

Trackback Address :: 이 글에는 트랙백을 보낼 수 없습니다