본문 바로가기
개발 업무(코딩)-개발자였을때 썼던..

TR전문 자르는 방식 예제(많이 쓰는 형태여서 예시코드 작성)

by 주용사 2023. 1. 8.
728x90
#include "chun.h"

typedef struct {
        char tcphead[1];
}Head;

typedef struct {
        Head tcphead;
        char a[1];
        char b[1];
        char count[1];
}Form, *iForm;

typedef struct {
        char name[5];
        char nick[3];
}subForm, *isubForm;

void     TR(char *InBuf, char *OuBuf);

int main()
{
        char *InBuf = "9132abcdefgh123456789";
        char *OuBuf;

        TR(InBuf, OuBuf);

        printf("OUTPUT = %s\n", OuBuf);
        return 0;
}

void     TR(char *InBuf, char *OuBuf)
{
        iForm iform = (iForm)InBuf; // 위치정보를 담는다.
        isubForm isubform = (isubForm)( iform + 1); // +1의의미는 iForm의 사이즈만큼 커진다는 의미다. 즉 InBuf에서 iform부분이 빠지게 된다.
        iForm oform = (iForm)OuBuf; // 뒤에 리스트만 짜르고 output만들어준다.

        char tcphead[1+1];
        char a[1+1];
        char b[1+1];
        char count[1+1];
        char name[5+1];
        char nick[3+1];
        int i = 0;
        int len = 0;

        memset(tcphead, 0x00, sizeof(tcphead));
        memset(a, 0x00, sizeof(a));
        memset(b, 0x00, sizeof(b));
        memset(count, 0x00, sizeof(count));

        memcpy(tcphead, iform->tcphead.tcphead, sizeof(iform->tcphead.tcphead));
        memcpy(a, iform->a, sizeof(iform->a));
        memcpy(b, iform->b, sizeof(iform->b));
        memcpy(count, iform->count, sizeof(iform->count));
        //sprintf(count, "%s", iform->count, sizeof(iform->count));

        printf("%s %s %s %s\n", iform->tcphead.tcphead, iform->a, iform->b, iform->count); // 주소값을 어떻게 가지고 출력하는지..
        printf("%s %s\n", isubform->name, isubform->nick);
        printf("---------------------------------\n");
        printf("[%s][%s][%s][%s]\n", tcphead, a, b, count);
        for( i = 0 ; i < atoi(count) ; i++)
        {
                memset(name, 0x00, sizeof(name));
                memset(nick, 0x00, sizeof(nick));
                memcpy(name, isubform->name, sizeof(isubform->name));
                memcpy(nick, isubform->nick, sizeof(isubform->nick));
                printf("i = %d ,,,,[%s][%s]\n", i, name, nick);
                isubform++;
        }

        len = sizeof(Form) + sizeof(subForm)*atoi(count); // 리스트를 담아줬다면 output의 데이터 길이일 것이다. 그러나 리스트를 빼서 주기때문에 밑에서 다르게 출력
        printf("output len = %d\n", len - sizeof(subForm)*atoi(count));
        memcpy(oform->tcphead.tcphead, tcphead, sizeof(tcphead));
        memcpy(oform->a, a, sizeof(a));
        memcpy(oform->b, b, sizeof(b));
        memcpy(oform->count, count, sizeof(count));
        memcpy(OuBuf, oform, sizeof(oform));
}

절취선 위는 구조체에 자르면서 담기 전이고

밑에는 구조체로 자른 형태다.

원형에는 tcphead를 포함한 메인데이터가 들어가고

sub에는 리스트형태가 들어간다고 생각하고 만든 예시이다.

왜 중간에 sprintf로 담으면 출력이 이상해지는 걸까..

728x90