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)을 다시 분리하여 구조체에 저장한후 출력하는것을 알려 드리겠습니다.

그럼 이만.

댓글 없음: