20140827 (메시지 맵, strrev, strupr, toupper, strlwr, tolower, strchr, strstr, strtol, strtoul, strod)

128일차








------------------------------

작성 중인 프로그램 작성 완료

------------------------------



--- 메세지 맵


메시지 맵 매크로, 메시지 맵 알고르즘이라고 불리는데,

ms사에 windows의 메시지를 받고 처리하는 방식을

이 방식으로 하였다.


간략하게 설명하자면 새로운 함수를 추가할 때마다

main함수의 소스를 수정해야 하는데,

메시지 맵. 이 방식을 사용하면 추가 함수와 배열만 건드리면 된다.


ex)


#include <stdio.h>

void Func1();
void Func2();
void Func3();
void Func4();
void Func5();

int main()
{
    int a;

    printf("1 ~ 5 중 입력 : ");
    scanf("%d"&a);

    if(a == 1)
    {
        Func1();
    }
    else if(a == 2)
    {
        Func2();
    }
    else if(a == 3)
    {
        Func3();
    }
    else if(a == 4)
    {
        Func4();
    }
    else if(a == 5)
    {
        Func5();
    }

    return 0;
}

void Func1()
{
    printf("Number 1.\n");
}

void Func2()
{
    printf("Number 2.\n");
}

void Func3()
{
    printf("Number 3.\n");
}

void Func4()
{
    printf("Number 4.\n");
}

void Func5()
{
    printf("Number 5.\n");
}



이런 소스가 있는데

만약 10까지 더 추가하게 되면

새로운 함수도 추가하고 main도 손봐야 한다.


메시지 맵 알고리즘을 사용하면


#include <stdio.h>

void Func1();
void Func2();
void Func3();
void Func4();
void Func5();

typedef struct _MSG_FUNC
{
    int FuncNum;
    void (*Func)();
}MSG_FUNC;

int main()
{
    int a;
    MSG_FUNC * FuncPoint;
    MSG_FUNC FuncArray[] = {
        {1, Func1},
        {2, Func2},
        {3, Func3},
        {4, Func4},
        {5, Func5},
        {00}
      };

    printf("1 ~ 5 중 입력 : ");
    scanf("%d"&a);

    for(FuncPoint = FuncArray; FuncPoint->FuncNum != 0; ++FuncPoint)
    {
        if(a == FuncPoint->FuncNum)
        {
            (FuncPoint->Func)();
            break;
        }
    }

    return 0;
}

void Func1()
{
    printf("Number 1.\n");
}

void Func2()
{
    printf("Number 2.\n");
}

void Func3()
{
    printf("Number 3.\n");
}

void Func4()
{
    printf("Number 4.\n");
}

void Func5()
{
    printf("Number 5.\n");
}




코드량도 줄고

배열에 멤버만 추가하면 같은 형태의 함수를

훨씬 쉽게 관리할 수 있다.







------- 문자, 문자열 함수


--- strrev

문자열 역순으로 변환


#include <string.h>


char * strrev(char *str);


str에 문자열을 역순으로 바꾸고 str에 다시 저장.


리턴값

역순으로 바뀐 문자열의 번지를 리턴




--- strupr

대문자로 변환


#include <string.h>


char * strupr(char * str);

int toupper(int ch);


strupr : str에 문자열을 변환하고 str에 다시 저장.


리턴값

strupr : 바뀐 문자열 번지 리턴

toupper : 대문자




--- strlwr

소문자로 변환


#include <string.h>


char * strlwr(char * str);

int tolower(int ch);


strlwr : str에 문자열을 변환하고 str에 다시 저장.


리턴값

strlwr : 바뀐 문자열 번지 리턴

tolower : 소문자





--- strchr

문자열에서 임의이 문자 시작하는 위치 찾기


#include <string.h>


char * strchr(const char * str, int chr);


str : 검색 대상 문자열

chr : 찾는 문자


리턴값

성공 : 찾고자 하는 문자가 발견된 위치 포인터를 반환

실패 : NULL



--- strstr

문자열에서 임의의 문자열이 시작하는 위치 찾기


#include <string.h>


char * strstr(const char * str1 , const char * str2);


str1 : 검색 대상 문자열

str2 : 찾고자 하는 문자열


리턴값

성공 : 찾고자 하는 문자열이 발견된 위치 포인터 반환

실패 : NULL




--- strtol, strtoul

문자열을 변환할 진법의 수로 변환


#include <stdlib.h>


long int strtol (const char* str, char** endptr, int base);

unsigned long int strtoul (const char* str, char** endptr, int base);


str : 변환시킬 문자열 주소

endptr : 변환된 숫자 다음 위치를 저장할 포인터. 사용하지 않을 시 NULL.

base : 변환할 진법


리턴값

성공 : 변환된 수

실패 : 0





--- strtod

문자열을 double형 수로 변환


double strtod (const char* str, char** endptr);


str : 변환시킬 문자열 주소

endptr : 변환된 숫자 다음 위치를 저장할 포인터. 사용하지 않을 시 NULL.


리턴값

성공 : 변환된 수

실패 : 0.0 반환

설정

트랙백

댓글