티스토리 툴바

블로그 이미지
상상의공간
개발자란...

calendar

    1 2 3 4 5
6 7 8 9 10 11 12
13 14 15 16 17 18 19
20 21 22 23 24 25 26
27 28 29 30 31    

Notice

2010/08/25 10:33 Study/C++

[1] 문자열에서 특정문자의 시작 위치를 알려주는 strchr()

 

문자열에서 특정문자의 시작 위치를 알려주는 strchr(...) 함수의 선언은 string.h 에 다음과 같이 선언되어 있습니다.

 

char*  strchr(const char* s,  int c);

 

선언에서 보듯이 문자열 s 에서 특정문자(-문자열이 아닙니다-) c 가 있는 첫번째 위치의 포인터를 반환해줍니다. 만약 문자열 s 에서 찾는 문자 c 가 없으면 NULL 을 반환합니다. 첫번째 위치 포인터라는 것이 무엇인지 예제를 통해 알아보도록 하겠습니다..

 

-------------------------------------------------------------------------------------

  #include <stdio.h>

  #include <string.h>

 

  int main(int argc, char** argv)

  {

    char*  ret  =  NULL;

 

    const char*  s  =  "This is a test program !";

 

    ret  =  strchr(s, 'i');

 

    if (  ret == NULL )

      printf("Not Found...");

    else

      printf("%s\n", ret);

  }

-------------------------------------------------------------------------------------

 

 

 

[그림 1]

[그림 1] 에서 보듯이 전체문자열 "This is a test program !" 에서 "is is a test program !" 만이 출력되었습니다. 소스에서 문자열 s 에는 두개의 문자 'i' 가 있지만 strchr(s, 'i') 로 인해 문자 'i' 가 시작되는 첫번째 위치의 포인터가 반환되었습니다. 즉, 변수 ret 는 "is is a test program !" 를 가리키는 포인터 입니다.

만약 위 소스에서 strchr(s, 'x'); 라고 한다면 반환값 ret 는 NULL 이 됩니다. (백문이 불여일타 입니다..직접 확인해보시기 바랍니다..^^)

 

 

 [2] 문자열에서 특정 문자열의 시작위치를 알려주는 strstr()

 

문자열에서 특정문자열의 시작 위치를 알려주는 strshr(...) 함수의 선언은 string.h 에 다음과 같이 선언되어 있습니다.

 

char*  strstr(const char* a,  const char* b);

 

선언에서 보듯이 문자열 a 에서 특정문자열 b 가 있는 첫번째 위치의 포인터를 반환해줍니다. 만약 문자열 a 에서 찾는 문자열 b 가 없으면 NULL 을 반환합니다. 이번에도 예제를 통해 알아보도록 하겠습니다..

 

-------------------------------------------------------------------------------------

  #include <stdio.h>

  #include <string.h>

 

  int main(int argc, char** argv)

  {

    char*  ret  =  NULL;

 

    const char*  a  =  "This is a test program !";

    

    ret  =  strstr(a, "test");

 

    if (  ret == NULL )

      printf("Not Found...");

    else

      printf("%s\n", ret);

  }

-------------------------------------------------------------------------------------

 

 

[그림 2]

 

[그림 2] 에서 보듯이 전체문자열 "This is a test program !" 에서 "test program !" 만이 출력되었습니다. 소스에서 문자열 a 에서 문자열 "test" 가 있는 첫번째 위치의 포인터가 반환되었습니다. 즉, 변수 ret 는 "test program !" 를 가리키는 포인터 입니다.

만약 위 소스에서 strshr(s, "hello"); 라고 한다면 반환값 ret 는 NULL 이 됩니다.

 

 

[3] 문자열에서 토큰(token)을 뽑아내는 strtok()

 

문자열에서 토큰(token)을 뽑아내는 strtok(...) 함수의 선언은 string.h 에 다음과 같이 선언되어 있습니다.

 

char*  strtok(char* s1,  char* s2);

 

토큰(token) 이라는 것은 특정한 구분자로 분리되는 문장구성요소입니다. (예를들어 "Hello, World" 라는 문자열이 있을때 구분자를  콤마로 정의한다면 토큰은 Hello 와 World 두개입니다.)

 

선언에서 보듯이 s2 문자열에 있는 구분자로 s1 믄자열을 토큰(token) 단위로 나누어 주는 함수입니다. 더 이상의 토큰이 없다면 반환값으로 NULL 을 리턴합니다. 그러나 strtok(...) 한번 수행으로 하나의 토큰만이 추출되기 때문에 계속해서 strtok(...) 를 호출해야 합니다. 즉, 처음 수행할때 s1에 구분자로 나눌 문자열을 지정하고 두번째 수행부터는 s1에 NULL값을 넣음으로써 계속해서 구분자로 나누는 작업을 할 수 있게 됩니다. 이번에도 예제를 통해 알아보도록 하겠습니다..

 

-------------------------------------------------------------------------------------

  #include <stdio.h>

  #include <string.h>

 

  int main(int argc, char** argv)

  {

    char*  token  =  NULL;

    char  s1[]  =  "This is a test\tprogram !\n";

    char  s2[]  =  "  ,\t\n";

   

    token  =  strtok(s1, s2);

 

    while  ( token  !=  NULL  )

    {

      printf("token  =  %s\n", token);

      token  =  strtok(NULL, s2);

    }    

  }

-------------------------------------------------------------------------------------

 

 

[그림 3]

 

[그림 3] 에서 보듯이 원본문자열 "This is a test\tprogram !\n"; 이 구분자 "  ,\t\n" 으로 구분이되었습니다. 즉, 구분자로 공백( ), 콤마(,) , 탭(\t) 또는 개행문자(\n) 를 사용하여 원본문자열을 토큰으로 분리했습니다. 이렇듯 strtok(...)는 문자열에서 적당한 분리자를 통해 원하는 문자열을 토큰단위로 뽑아낼 수 있습니다.

 

테스트를 위해 구분자에서 공백과 콤마를 제외해 보죠..이제 구분자는 탭(\t)과 개행문자(\n) 입니다. 변경된 소스는 다음과 같습니다..

-------------------------------------------------------------------------------------

  #include <stdio.h>

  #include <string.h>

 

  int main(int argc, char** argv)

  {

    char*  token  =  NULL;

    char  s1[]  =  "This is a test\tprogram !\n";

    char  s2[]  =  "\t\n";  // 구분자에서 공백과 컴마를 제외함.

   

    token  =  strtok(s1, s2);

 

    while  ( token  !=  NULL  )

    {

      printf("token  =  %s\n", token);

      token  =  strtok(NULL, s2);

    }    

  }

-------------------------------------------------------------------------------------

 

[그림 4]

 

[그림 4] 처럼 토큰은 2개입니다. 즉, 탭과 개행문자에 의해서만 구분되는 "This is a test" 와 "program !" 입니다.

 

 

그러나 strtok(...) 를 사용하실때는 반드시 기억해야 할것이 있습니다. strtok(...) 를 사용할때마다 원본문자열이 변한다는 것입니다. 즉, strtok(...) 를 사용하면 원본문자열 (-s1-)에 무조건 변경이 가해진다는 것입니다. 위의 소스에서 원본문자열을 다음과 같이 변경하면 실행시 에러가 납니다. 왜냐하면 원본문자열이 변경되어야 하는데 변경될 공간이 없기 때문입니다..(직접 한번 해보세요 )

 

char*  s1  =  "This is a test\tprogram !\n";    [Error]

char s1[]  =  "This is a test\tprogram !\n";     [OK]

 

저작권 : http://ivory118.tistory.com/trackback/300

저작자 표시 비영리 변경 금지

'Study > C++' 카테고리의 다른 글

문자열함수 strtok(), strchr(), strstr()  (0) 2010/08/25
posted by 상상의공간
prev 1 2 3 4 5 6 ... 150 next