키워드 [Programming][VC++][String]
http://www.devpia.com/MAEUL/Contents/Detail.aspx?BoardID=51&MAEULNo=20&no=7534&ref=7534

질문글을 보다가 문득 예전 자료가 생각나서.. 잠시 올려봅니다.
보통 문자열을 파싱할 때, 많이 쓰이는게 구분자를 문자열중에 찾는 겁니다.
만약 구분자가 여러개라면?


아이디어는 strtok 소스를 보면서 따온겁니다.
현재 고속으로 문자열을 처리할 때 지금도 사용중이며, 좀더 좋은 아이디어나 자료가 있으신분들은
공유해 주시면 감사~~ ^^;


아래의 예제는 간단하게, 주어진 문자열에서 숫자, 대문자, 소문자의 갯수를 출력하는 루틴입니다.
응용은 본인이 필요한 형식에 따라 하시면 되겠죠.
(한글이 포함되었을 경우는 별도 처리가 필요하지만 생략...)
 
문자열 고속 처리에 관심이 많은데, 좋은 자료를 구할 수 있는 곳이나..
숨겨놓은 보석이 있으시면 공개좀.. ^^;

#define CHECK_MAP(map, arg) ((map[arg >> 3] & (1 << (arg & 7))) && arg)
 
unsigned char map_num[32];
unsigned char map_so[32];
unsigned char map_dae[32];

void init()
{
    int i;
    char* ctrl_num = "1234567890";
    for (i = 0; i < 32; ++i)
        map_num[i] = 0;
    do
    {
        map_num[*ctrl_num >> 3] |= (1 << (*ctrl_num & 7));
    } while (*ctrl_num++);

    char* ctrl_so = "abcdefghijklmnopqrstuvwxyz";
    for (i = 0; i < 32; ++i)
        map_so[i] = 0;
    do
    {
        map_so[*ctrl_so >> 3] |= (1 << (*ctrl_so & 7));
    } while (*ctrl_so++);

    char* ctrl_dae = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";
    for (i = 0; i < 32; ++i)
        map_dae[i] = 0;
    do
    {
        map_dae[*ctrl_dae >> 3] |= (1 << (*ctrl_dae & 7));
    } while (*ctrl_dae++);
}

void getsome(const char* str, int& num, int& so, int& dae)
{
    if(str == NULL || str[0] == 0)
        return;

    num = so = dae = 0;
    while(*str)
    {
        if(CHECK_MAP(map_num, *str))
            num++;
        else if(CHECK_MAP(map_so, *str))
            so++;
        else if(CHECK_MAP(map_dae, *str))
            dae++;
        ++str;
    }
}

int main()
{
    const char* p = "12341441srsfafAAFSaf";
    int num, so, dae;
    init();
    getsome(p, num, so, dae);
    return 0;
}

------------------------------------------
num = 8, so = 8, dae = 4;

+ Recent posts