문자열 trim

문자열 앞 뒤로 공간이 있는 경우 파싱을 하는데 방해 되는 경우가 많다.  함수 이름은 trim()이라 정하고 std::string()을 사용한 함수와 사용하지 않은 함수의 두 가지 버전으로 만들어 본다.

작은 기능이기 때문에 코드에 대한 설명은 별도로 하지 않는다.

추가 적으로 문자열이 int인지 체크하는 IsInt() 함수와 float형인지 체크하는 IsFloat() 함수도 같이 만들어 본다.

디버깅을 위한 OutputDebugString() 간편하게 사용하기 위한 OutputDebugPrintf()도 같이 만들어 본다.

순서는 다음과 같다.

< std::string()을 사용한 버전 >
< std::string()을 사용하지 않은 버전 >
< 정수인지 체크하는 IsInt() >
< float인지 체크하는 IsFloat() >
< OutputDebugPrintf() >

< std::string()을 사용한 버전 >

#define TRIM_SPACE " \t\n\v"

 

namespace    std

    inline std::string trim(std::string& s,const std::string& drop = TRIM_SPACE) 

    { 

        std::string r=s.erase(s.find_last_not_of(drop)+1); 

        return r.erase(0,r.find_first_not_of(drop)); 

    } 

    inline std::string rtrim(std::string s,const std::string& drop = TRIM_SPACE) 

    { 

        return s.erase(s.find_last_not_of(drop)+1); 

    } 

    inline std::string ltrim(std::string s,const std::string& drop = TRIM_SPACE) 

    { 

        return s.erase(0,s.find_first_not_of(drop)); 

    } 

}

< std::string()을 사용하지 않은 버전 >

void rtrim(char* s)

{

    char *end;

 

    end = s + strlen(s) - 1;

    while( end != s && isspace( *end ) )

        end--;

 

    *(end + 1) = '\0';

}

 

void ltrim(const char *s, char* res, int num )

{

    const char* begin = s;

 

    while( *begin != 0 )

    {

        if( isspace( *begin ) )

            begin++;

        else

        {

            strcpy_s( res, num, begin );       

            break;

        }

    }

}

 

void trim( const char *s, char* result, int num )

{

    ltrim( s, result, num );

    rtrim( result );

}

< 정수인지 체크하는 IsInt() >

bool IsInt( const char *s )

{

    if( s == NULL || *s == 0 )

        return false;

    const char* p = s;

    if( *p == '-' || *p== '+' )

        p++;

    while( *p )

    {

        if( *p < '0' || *p > '9')

            return false;

        p++;

    }

    return true;

}

< float인지 체크하는 IsFloat() >

bool IsFloat( const char *s )

{

    if( s == NULL || *s == 0 )

        return false;

    const char* p = s;

    if( *p == '-' || *p== '+' )

        p++;

 

    //문자열 앞에 0이 있으면 소수점

    if( *p == '0' )

    {

        p++;

        if( *p != '.' )

            return false;

        else

            p++;

    }

 

    int nIndex = 0, nCount = 0;

    while( *p )

    {

        if( *p < '0' || *p > '9' )

        {

            //소수점 체크. 소수점은 1.234처럼 숫자 중간에 단 한매만 올수 있으며,

            //.123과 같이 숫자 맨앞에 혹은 123.과 같이 숫자맨뒤에 소수점이 올수 없다.

            if( ( *p != '.' ) ||

                ( *p == '.' && nIndex == 0 ) ||

                ( *p == '.' && nCount > 0 ))

            {

                return false;

            }

            else

            {

                *p++;

                if( *p == NULL )

                {

                    return false;

                }

                nCount++;

            }

        }

        else

            p++;

 

        nIndex++;

    }

    return true;

}

< OutputDebugPrintf() >

#if defined(_DEBUG)

void OutputDebugPrintf(char* fmt, ...)

{

    char buffer[400];

 

    memset( buffer, 0, 400 );

    va_list argptr;

    int cnt;

 

    va_start(argptr, fmt);

    cnt = vsprintf_s(buffer, 400, fmt, argptr);

    va_end(argptr);

 

    OutputDebugString(buffer);

}

 

#else 

inline void OutputDebugPrintf(char* fmt, ...);

#endif

소스: trim_demo.cpp