본문 바로가기
Programming/C++

문자열 처리

by 작은별하나 2014. 9. 26.
반응형

[질문]


질문드립니다. ^^;

char    lhlParsingData[100][256];

char    StrTmp = "ABC|||DEF";


토근 구분자 "|" 하나를 사용합니다.

strtok 함수를 사용해서 lhlParsingData[arry] 에 저장하려고 합니다.


제가 원하는건.. 

 lhlParsingData[0] = "ABC"

 lhlParsingData[1] = ""

 lhlParsingData[2] = ""

 lhlParsingData[3] = "DEF"


값을 원하는뎅... 로그를 찍어보면..

 lhlParsingData[0] = "ABC"

 lhlParsingData[1] = "DEF"


제가 원하는 값으로 쪼갤수 없나여 ? (기타 다른 함수를 사용 해서라도..???)


[답]


strtok(...)으로는 어렵습니다.  그 이유는, strtok(...)은 여러개의 분리자가 겹쳐있는 경우, 그것을 그냥 다 스킵해요.  그래서 새로 만드셔야 하는데요.  strtok(...)과 같은 인터페이스로 만들 수도 있지만... char **split(...); 형태로 만들께요.  이 함수의 문제점은 모두 배열을 할당받기 때문에.. 좀 문제가 있습니다.


예를 들어서 char **split(const char *str, char delimeter) 란 함수를 이용해서 문자열 배열을 받는 방법을 설명드리면요.


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

char **split(const char *str, char delimeter);

void main()
{
  char **p;
  char **t;
  char *s = "ABC||DEF";

  p = split(s, '|');
  for( t = p ; *t ; t++ )
    printf("[%s]\n", *t);
}


형태로 만드시면 되요..


char **split(const char *str, char delimeter)
{
   char **p;
   int count = 0;
   char *t;
   int b, c;

   for( t = str ; *t ; t++ )  if( *t == delemeter ) count++;

  p = (char **)malloc(sizeof(char *)*(count+2));

  for( t = str, count = 0, c = 0, b = 0 ;  ; t++, c++ )
  {
       if( *t == delemeter || *t == 0 )
       {
           p[count] = (char *)malloc(c+1);
           memcpy(p[count], str+b, c);
           p[count][c] = 0;
           count++;
           b += c+1;
           c = -1;
           if( *t == 0 ) break;
       }
  }
  return p;
}


그냥 온라인에서 생각나는대로 짜서.. 오류가 있을지도 모르겠네요.

아마 있을 것 같기는 한데.. 여하튼 그 부분은 해결해보세요..


728x90

댓글