본문 바로가기

C/C++/Tip

[C 파싱] 파싱 할때 팁.

반응형

 

 

파싱이란.. ?

 

buf 0

buf 1

2

3

4

5

a

a

b

b

c

NULL

 

위의 표 처럼

 

buf 안에 "aabbc" 가 있을때

난 "aa", "bb" , 'c' 와 같이 따로따로 값이 필요 할때

한몸으로 되있는 buf 안에서 필요한 부분만 쏙쏙 빼오는걸 파싱 이라고 합니다.

( 흔히 쓰는 말일뿐 정확하게 정해진 말은 아니므로, 의미하는바가 다를수도 있습니다.. )

 

여튼..

 

전 파싱을 할때

 

sprintf, snprintf 를 많이 사용 합니다.

( memcpy 로도 간단하게 파싱이 가능하지만 아무래도 메모리를 바로 참조하는게..부담이 되서,

멤카피 보단 printf 종류를 선호 합니다. )

 

다들 아시다시피..

 

 

sprintf(str, "%-2s", buf);

snprintf(str, 3, "%-2s", buf);

 

 

이런 방식으로 사용 합니다.

 

str 안에다 buf 안의 있는 값을 2자리 갔다 채운다는 뜻이죠.

 

"%-2s" 여기서 2가 두자리를 의미하고, - 기호는 2자리가 안되면 나머지를 스페이스바 처리를 해주라는 의미죠.

 

어쨋든, 핵심은 파싱을 할때 "%-10s", "%05d" 등과 같이 상수를 그대로 갔다 쓰는 경우가 있습니다.

( 저만 그런건지는 몰라도..)

 

상수를 그대로 갔다 쓴다고 딱히 안되거나 하는건 아니지만,

 

파싱은 주고 패킷 통신에서 많이 사용하니 패킷을 예로 들겠습니다.

 

 

갑작스럽게 패킷 사이즈가 변경이 되거나

중간에 필드가 추가 되거나 하는 상황이 생긴다면,

 

저렇게 상수로 표현해 뒀을때 일일이 하나하나 다!! 찾아다니면서 수정을 해줘야 합니다.

 

뭐 필드도 몇자리 안되고 ~ 그리 큰 프로젝트가 아니라면 금방 고치겠지만, 그게 아니라면 ?

정말 힘이 듭니다.

이때 실수도 많이 하게 되구요.

 

 

그래서 이때 "%-10s" 대신 "%-*s", size 라고 사용을 하게 되면

 

 

#define TEST_SIZE 2

sprintf(str, "%-*s",TEST_SIZE ,buf);

snprintf(str, TEST_SIZE+1, "%-*s", TEST_SIZE, buf);

 

 

이런식으로 코딩을 할수가 있죠.

상수가 들어갈 부분에 * ( 에스트리크 / 씨쁘트+8) 을 쓰고 그 바로 옆에 콤마를 찍고~ 별땡이에 들어갈 사이즈를 명시하면 됩니다.

 

이렇게 되면 확실히 일일이 찾아다닐 필요없이

매크로로 지정해둔것만 찾아서 값을 수정할수가 있으니 훨씬 편리하겠죠 ?

 

어서 해보세요 ~ !

반응형