∇ 프로그래밍 소품 및 팁

 ▼ 문자열 조합, 유사 sprintf

C++

N/A

표준 함수를 사용하지 않으면서 문자열 스트링을 조합해야하는 경우가 생겨서 만들어 보았다. 일반적으로 sprintf()를 통해 할 수 있는 것이지만 인생을 살다보니 C 표준 라이브러리를 사용하지 않아야 할 때도 생겼다. 그렇다고 vprintf()만큼의 아름다운 기능을 요구하는 것도 아니고 단순히 스트링에 필요한 숫자들을 조합하기 위해서 필요했던 것이라 최소한의 기능으로 만들어 보았다.

전체적으로 sprintf()와 유사하지만 format 스트링에서 '@'로 표시된 것을 파라미터로 들어온 숫자로 치환하는 것이 다른 점이다. 예를 들어, "value = @, @"이고 파라미터가 100, 200이라면 "value = 100, 200"이라는 문자열을 만들어 돌려 주는 것이다.

함수의 선언은 다음과 같다.

void ComposeString(char pBuffer[], const char* szFormat, const int data...)

szFormat에 문자열을 보내주고 뒤의 data에는 그에 맞는 정수형 파라미터를 가변적인 개수로 보내준다. 그러면 그것을 처리하여 pBuffer에 돌려주는 함수이다. 사용 예를 들면 다음과 같다.

    01: int main()
    02: {
    03:     char buffer[256];
    04:
    05:     ComposeString(buffer, "1 = @, 12 = @, -123 = @", 1, 12, -123);
    06:
    07:     puts(buffer);
    08:
    09:     return 0;
    10: }

다음은 위의 코드를 실행했을 때의 출력 결과이다.

    > 1 = 1, 12 = 12, -123 = -123

다음은 위의 함수를 구현하기 위한 코드이다.

    01: static void s_Int2Str(char **ppBuffer, int value)
    02: {
    03:     if (value == 0)
    04:     {
    05:         *((*ppBuffer)++) = '0';
    06:     }
    07:     else
    08:     {
    09:         if (value < 0)
    10:         {
    11:             *((*ppBuffer)++) = '-';
    12:             value = -value;
    13:         }
    14:
    15:         int nNum = 0;
    16:         int temp = value;
    17:         while (temp)
    18:         {
    19:             temp = temp / 10;
    20:             ++nNum;
    21:         }
    22:
    23:         int nLoop = nNum;
    24:         while (nLoop-- > 0)
    25:         {
    26:             (*ppBuffer)[nLoop] = (value % 10) + '0';
    27:             value = value / 10;
    28:         }
    29:         *ppBuffer += nNum;
    30:     }
    31: }
    32:
    33: static void ComposeString(char pBuffer[],
    34:                           const char* szFormat, const int data...)
    35: {
    36:     if (pBuffer == 0)
    37:         return;
    38:
    39:     
    const int* pData = &data;
    40:
    41:     
    while (*szFormat)
    42:     {
    43:         if (*szFormat != '@')
    44:         {
    45:             *pBuffer++ = *szFormat++;
    46:             continue;
    47:         }
    48:         ++szFormat;
    49:         s_Int2Str(&pBuffer, *pData++);
    50:     }
    51:
    52:     *pBuffer = 0;
    53: }