Language/C C언어 강좌 (문자 함수/구조체/typedef 문/구조체의 정의/struct/전처리 주석 처리법/구조체의 초기화 )
  • 728x90
    반응형

     

     

     

    C언어 Chapter 25.


     

     

    문자 함수

    • 문자를 다루는 라이브러리 함수의 헤더파일이 <ctype.h>에 정의되어 있다.
    • 문자가 특정부류에 속하면 참을(1), 아니면 거짓(0)을 봔환.

     

     

    🔔 예) 문자 함수를 사용한 프로그램의 예

    #include<stdio.h>
    #include<ctype.h>
       
    int main()
    {
        if(isalnum ('a'))
        {
            printf("\'a\' is alphnum\n");    // 'a' is alphnum
        }
        else
        {
            printf("\'a' is not alphnum\n");    
        }
       
          
        if(iscntrl ('\5'))
        {
            printf("\'5\' is aplhnum\n");    // '\t' is cntl
        }
        else
        {
            printf("\'5\' is not aplhnum\n");    
        }
       
        if(iscntrl ('\t'))
        {
            printf("\'\\t\' is cntrl\n");    // '\t' is cntl
        }
        else
        {
            printf("\'\\t\' is not cntrl\n");
        }
       
        if(isalpha ('a'))
        {
            printf("\'a\' is alpha\n");        // 'a' is alpha
        }
        else
        {
            printf("\'a\' is not alpha\n");        
        }
       
        if(isdigit ('5'))
        {
            printf("5 is digit\n");        // 5 is digit
        }
        else
        {
            printf("5 is not digit\n");    
        }
       
        if(isgraph (0x14))
        {
            printf("%c is graph\n", 0x14);
        }
        else
        {
            printf("%c is not graph\n", 0x14);
        }
       
        if(islower('b'))
        {
            printf("\'b\' is lower\n");        // 'b' is alpha
        }
        else
        {
            printf("\'b\' is not lower\n");
        }
       
        if(isprint ('c'))
        {
            printf("\'c\' is print\n");        // 'c' is print
        }
        else
        {
            printf("\'c\' is not print\n");
        }
       
        if(ispunct ('(')))
        {
            printf("\'(\' is punct\n");        // '(' is punct
        }
        else
        {
            printf("\'(\' is not punct\n");
        }
       
        if(isspace (' '))
        {
            printf("\' \' is space\n");        // ' ' is space
        }
        else
        {
            printf("\' \' is not space\n");    
        }
          
        if(isupper('A'))
        {
            printf("\'A\' is upper\n");        // 'A' is upper
        }
        else
        {
            printf("\'A\' is not upper\n");        
        }
       
        if(isxdigit ('f'))
        {
            printf("\'f\' is xdigit\n");        // 'f' is xdigit
        }
        else
        {
            printf("\'f\' is not xdigit\n");
        }
       
        printf("lower of \'A\' is %c\n", tolower ('A')); // lower of 'A' is a
        printf("upper of \'a\' is %c\n", toupper ('a')); // upper of 'a' is A
       
        return 0;
    }

     

    결과

     

     

     

    구조체

    • 연관된 여러 데이터를 하나의 이름으로 묶은 사용자 정의 자료형 이다.
    • 여러 가지 속성을 가지고 있는 개체를 정의할 수 있다.

     

     

    typedef 문

    • 자료형을 정의 하는 데 사용된다.
    • type define 의 줄임말이다.

    💡 예를 들면 긴 이름의 자료형을 짧게 정의하는 데 편리하게 이용되며 구조체의 선언에서 유용하게 사용된다.

     

     

    🔔 예) typedef 문의 사용예

     

    결과

     

     

    🔔 예) typedef name 표현 방식

     

    • u_char;    // unsigned char 의 표현방식
    • u_itn8_t;    // unsigned int 8byte typedef 의 표현방식

     

     

    🔔 예) typedef 로 정의한 자료형을 이용하여 프로그램을 작성하는 예

     

    결과

     

     

    구조체의 정의

    • 구조체는 의미상으로 서로 연관이 되지만 자료형이 다른 자료들을 하나의 이름으로 묶은 것이다.
    • 구조체와 배열은 서로 중첩되게 정의할 수 있다.
    • C언어에서는 구조체와 배열의 중첩적으로 정의하므로 복잡한 구조의 자료를 효율적으로 구성할 수 있다.

     

    🎯 구조체의 원형(template)을 정의하고, 변수를 선언하는 방법

    • struct 사전 의미로 구조.

    struct EMB

    {

        int inum;

        char cName[20];

    };

     

    • 구조체의 구성요소를 정의하는 것은 메모리의 할당과는 무관하다.
    • EMB는 태그(tag) 라고 부르는 구조체 템플릿의 이름이다.
    • 태그 다음에는 중괄호에 둘러싸여 정의 된다.
    • 마지막에는 세미클론으로 끝난다.
    • 중괄호에 둘러싸인 각 구성요소는 멤버 라고 부른다.
    • 구조체 멤버의 자료형은 모든 자료형이 허용된다.

     

     

    🎯 프로그램 설명

    • 구조체를 main함수에서 A type로 정의하면 구조체 전체의 크기 24byte인 변수 A가 정의 된다.
    • 구조체 선언은 다음과 같다.

    struct EMB A;    // 변수의 선언

     

    • A 의 구조체 안의 변수 inum을 사용하는 방법은 아래와 같다.
    • 구조체의 멤버는 도트연산자(.)를 사용하여 접근한다.
      구조체변수.멤버이름

    A.inum;

    A.cName[20];

     

    • 구조체 변수 메모리 할당 (구조체는 한 덩어리로 보며 순서대로 배치된다.)

     

    BFFFF9A4↓

    inum
    cName

     

    BFFFF9A8

     

     

    💡 구조체는 main문 안에 쓸 수도 있다. 하지만, main문 내부 중괄호에서 밖에 쓸 수 없다.

     

     

    구조체안의 메모리 형태

     

    • 구조체안의 메모리 형태

     

    [4byte]

    int A
    char B      
    int C      
    short D char E  
    int F
    char G   short H
    char I      

     

     

    결과 : 위 소스의 구조체 size = 28byte

     

    • 메모리 최적화를 위해 아래와 같이 순서를 바꿀수있다.

     

    [4byte]

    int A
    char B char G short H
    int C
    short D char E char I
    int F

     

    결과 : 변경 후 구조체 size = 20byte

     

    #paragma pack(1)

     

    • 위의 구조체 메모리 최적화 과정을 전처리 언어로 해결해 준다.
    • 자리를 바꾸어 최적화 하는것 보다 속도는 떨어진다.

    #pragma pack(4)

     

    • 4로 바꾸면 원래의 최적화되지 않은 상태로 돌아온다.

     

     

    🎯 typedef를 이용하여 구조체를 정의 하는 방법

     

     

    < 소스 설명 >

    • 위와 같이 정의하면 main문 안에서

    emb A;

    EMB A;

     

    • 위와 와 같이 구조체 변수를 정의할 수 있다.

     

    • 편의에 따라 대문자 EMB는 생략할수도 있다.

     

     

    🔔 예) 학생의 이름과 성적을 입력받아 출력하는 프로그램

     

    결과

     

     

    구조체의 초기화

    • 구조체도 배열의 경우와 같이 변수의 선언시 초기화시킬 수 있다.

     

    🔔 예) 두점의 위치로 부터 거리를 계산하는 프로그램으로 구조체를 초기화 하여 사용한다.

     

    🎯 프로그램 설명

    PONTER p1 = {0, 0}, p2 = {1, 1};

     

    • 변수 p1과 p2는 구조체 변수이면서 선언과 동시에 초기값이 주어졌다.
    • 구조체 필드의 값은 중괄호{ } 내에 콤마로 구분되어 최기화 되었다.
    • 초기값은 구조체 멤버의 자료형과 일치 되어야한다.
    • 구조체 변수 내의 멤버들은 다른 구조체 변수가 가지는 멤버들의 값을 한꺼번에 부여받을 수가 있는 것이다.

    p1 = p2;

     

    • 위와 같이 동일한 구조체인 경우 p1변수는 p2변수의 값을 받을 수 있다.

    결과

     

    💡 Tip : 전처리 주석처리 방법(주석처리의 고퀄리티 방법)

     

     

    • if 1 이 들어가면 변경전이 실행되고
    • if 0, else 1이 들어가면 변경후가 실행된다.
    • else if 는 #elif 로 사용 가능하다.

     

     

     

     

    728x90
    반응형
상단으로