2022년 1월 24일 월요일

C 문자열 분리 방법 1강

 오늘 포스팅 할 내용은 C 언어에서 문자열을 특정 기호로 분리한는 방법을 알아 보겠습니다.

단순 문자로 분리하여 출력까지 하는것을 이야기 하겠습니다.

작성 방법은 API를 안쓰는 방법(무식한 방법?)과 API를 쓰는 방법 두가지를 알아 보겠습니다.

작성을 위해서 기본적인 문자열 예시를 들겠습니다.

"Title=Blog@Writer=Berdo@PostDate=20220120"

기본 문자열은 위와 같습니다.

그냥 읽어보면 3개의 항목으로 키/값으로 분리 된것으로 보일겁니다.

일단 첫번째로 3개의 항목을 분리하여 간단히 출력하는 프로그램을 작성합니다.

프로그램 작성은 Windows에 Visual Studio Code 설치후 gcc 기반으로 작성 됩니다.

기본 프로그램 환경 구축은 아래 제 블러그 링크에서 확인하고 구성 하시면 됩니다.

Window GCC 환경구축

코드를 먼저 보고 설명을 시작 하겠습니다.


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

void main()
{
    char* sOrgSrc = "Title=Blog@Writer=Berdo@PostDate=20220120";

    //일반 구문으로 아이템 분리.
    int nOrgSrcLen = strlen(sOrgSrc);

    int nSTItem=0, nIdx=0;
    char szPrt[128]={0};
    for (nIdx = 0; nIdx < nOrgSrcLen; nIdx++)
    {
        if (sOrgSrc[nIdx] == '@')
        {
            strncpy(szPrt, sOrgSrc+nSTItem, nIdx-nSTItem);
            printf("[Item:%s]\n", szPrt);
            memset(szPrt, 0x00, 128);
            nSTItem = nIdx+1;
        }        
    }

    //마지막항목 출력.
    strncpy(szPrt, sOrgSrc+nSTItem, nOrgSrcLen-nSTItem);
    printf("[Item:%s]\n", szPrt);
}

API를 안쓰게 되면 문자열을 길이만큼 for 문을 이용하여 반복하다 '@' 문자를 만나면

길이만큼 짤라서 출력하는 구조 입니다.

출력을 위해서 szPrt 변수를 별도로 이용했구요.

strncpy 를 이용해서 문자열 복사를 했는데 마지막 인자값이 주어진 길이만큼만 복사 하는것 입니다.

하나의 아이템을 잘라서 출력한다음 다음 구문 분석을 위해서 시작 위치를 잡아 주기 위해서 nSTItem 변수를

사용했습니다.

마지막 항목을 출력하기 위해서 for문이 종료되고 난후 마지막 항목을 출력했습니다.

두번째 코드는 'strstr' API를 이용하여 문자열 분리 하는 방법입니다.

코드를 먼저 보고 설명을 시작 하겠습니다.

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

void main()
{
    char* sOrgSrc = "Title=Blog@Writer=Berdo@PostDate=20220120";

    //strstr 을 사용하여 아이템 분리.
    int nSTPos = 0, nLen;
    char szPrt[128]={0};
    while (1)
    {
        char* pFind = strstr(sOrgSrc+nSTPos, "@");
        
        if (pFind != NULL)
        {
            nLen = pFind - (sOrgSrc+nSTPos);
            strncpy(szPrt, sOrgSrc+nSTPos, nLen);
            printf("[Item:%s]\n", szPrt);
            memset(szPrt, 0x00, 128);
            nSTPos += nLen + 1;
        }
        else
        {
            strncpy(szPrt, sOrgSrc+nSTPos, strlen(sOrgSrc) - nSTPos);
            printf("[Item:%s]\n", szPrt);
            break;
        }                    
    }
}

'strstr' 사용은 처음인자에 검색대상 문자열 포인터를 지정합니다.

두번째 인자에는 검색할 문자열을 입력합니다.

'strstr'을 실행하고 나온 결과값은 검색된 문자열 포인터 위치를 리턴하게 됩니다.

말로만 설명을 하면 이해하기 어려우니 아래 그림으로 보시면 이해가 가실거에요.





위 그림에서 보시듯이 pFind 주소값이 sOrgSrc 보다 뒤에 있기 때문에

pFind 에서 검색 시작점을 빼주면 실제 분리될 아이템의 길이가 됩니다.

그러면 szPtr 에 복사한후 출력합니다.

마지막값은 검색하면 'NULL' 이 나오기 때문에 문자열의 마지막까지 복사한후

출력하면 됩니다.

기본적인 C 언어를 이용한 문자열 파싱을 알아 봤습니다.

다음번에는 분리된 아이템(Key=Value)을 다시 분리하여 구조체에 저장한후 출력하는것을 알려 드리겠습니다.

그럼 이만.

댓글 없음: