The qDecoder Project

Modify Delete Post Reply Forward List
Written by 네오 ([email protected]) Hits: 87 , Lines: 86
Re: 이럴 경우엔?
oasis wrote:
> <[email protected]>에서 [email protected]만 추출해 내고 싶은데 어케?

우선 말씀드리고 싶은 것은 스트링으로 어떤 조작을 원할 때에는 Regular Expression 을 사용하는 것이 가장 편한 방법중에 하나 입니다. 그런데 아시다시피 Perl 이나 PHP  같은 스크립트 언어들은 자체적으로 RE 를 처리 하는 펑션들이 들어 있는데 C 에서 사용하기 위해서는 함수를 구현해야 하는 불편이 있습니다만.. 퍼블릭 도메인 사이트 같은데 보시면 그래도 쓸만한 RE 라이브러리가 있을 겁니다. 이런걸 찾아서 자기것으로 만들어서 사용하시는 것이 가장 좋은 방법이라 추천해 드리고 싶슴다.. ^^

에구..서론이 넘 길어졌군여.. ^^.

qDecoder 함수중에 아마 qRemoveSpace 라는 함수가 있을 건데 그걸로는 원하시는 기능을 얻을 수 없을 것 같습니다. 그래서 아래처럼 qStrTrim 이라는 함수를 한번 만들어서 사용해 보는 것도 괜찬을 거 같네요. ^^..

아래 함수는 말 그대로 스트링 값의 앞,뒤에서 원하는 문자들을 제거해 줍니다. 스페이스 뿐만 아니고 argument 로 전달된 값들을 지워주게 되지요.

// 문자열이 값을 가지고 있는지 아닌지를 판단해 주는 매크로 입니다.
#define ISZERO(s) ((s) && *(s) ? FALSE : TRUE)

char * qStrTrim(char *pszSrc, const char *pszLTrimChars, const char *pszRTrimChars)
{
char *pBegin, *pEnd;

// 원하는 문자열에 값이 없으면 바로 리턴
if (ISZERO(pszSrc))
return pszSrc;

// 스트링의 오른쪽에서 원하는 문자들을 제거 해 나갑니다.
if (! ISZERO(pszRTrimChars)) {
pEnd = pszSrc + strlen(pszSrc) – 1;
while (pEnd >= pszSrc && strchr(pszRTrimChars, *pEnd))
pEnd–;

*++pEnd = ‘’;
}

// 이젠 스트링의 왼쪽 그러니까 시작점 부터 원하는 문자들을 제거하죠.
if (! ISZERO(pszLTrimChars)) {
pBegin = pEnd = pszSrc;
while (*pEnd != ‘’ && strchr(pszLTrimChars, *pEnd))
pEnd++;

/* data move */
if (pBegin < pEnd) {
while (*pEnd != ‘’)
*pBegin++ = *pEnd++;
*pBegin = ‘’;
}
}

return pszSrc;
}

예제임다. ^^.

{
char szString[32];

// 위에서 바꾸기를 원하시던 문자열을 버퍼에 저장하기로 하죠.
sprintf(szString, "%s", "<[email protected]>");

// 그런 다음에 위 함수를 호출합니다.
qStrTrim(szString, "<", ">");

// 확인을 위해서 ^^
fprintf(stdout, "%sn", szString);
}

위처럼 사용하시면 될 것 같네요.. ^^. 함수의 프로토타입을 보면 char * 를 반환하게 되어 있는데 실제로는 첫번째 인자로 전달된 버퍼에서 실제의 값을 바꾸어 주게 되어 있습니다. 그러면서 포인터로도 그 주소를 돌려 주는겁니다. 그러니 위에서 처럼 반환값을 받지 않아도 괜찬을 검다.

참고로 두번째와 세번째의 인자인

const char *pszLTrimChars, const char *pszRTrimChars

를 보시면 스트링으로 전달이 됩니다. 그런데 qStrTrim 안에서는 이걸 문자열로 취급하지 않고 각각의 문자로 처리를 합니다. 무슨 말이냐면

qStrTrim(szString, " t<", " >trn");

이런식으로 호출을 할 수 있다는 것이지요. 그럼 왼쪽에서는 스페이스,탭,또는 ‘<‘ 문자는 모두 없어지는 것이고 오른쪽에서 부터는 ‘>’,스페이스,탭,캐리지리턴,라인피드 문자가 모두 없어지는 겁니다. ^^..

참고로

qStrTrim(szString, NULL, " >trn"); // 오른쪽에서만 문자제거

qStrTrim(szString, " t<", NULL); // 왼쪽에서만 문자 제거

qStrTrim(szString, NULL, NULL); // 이건?? 아무것두 안지움. 의미가 없죠. ^_^

이해 하셨으리라 보구 잘 사용해 보시길.. ^^..

지나가다가 질문이 있어서 함 답변을 드려봤습니다. 구럼…..
Prev : 이럴 경우엔?
Next : [질문]아..시간 계산 할려고하는데
February 11, 2002 (11:49) from 64.160.23.165
CrazyWWWBoard 98 Professional Edition II
Modify Delete Post Reply Forward List

[Home] [About] [Examples] [Changes] [Download] [Install] [Reference] [Bugs] [Q&A;]
Netchestra bizWorker