본문 바로가기
코스웨어/16년 스마트컨트롤러

2016-04-07-조재찬_업무일지_구조체 및 함수

by 알 수 없는 사용자 2016. 4. 15.
728x90
반응형

구조체와 배열


연관되었지만 타입이 다른 자료형의 경우는 구조체, 

같은 경우는 배열 사용



1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
#include <stdio.h>
#include <string.h>

struct person
{
    char name[20];
    char phoneNum[20];
    int age;
};

int main()
{
    struct person man1, man2;
    strcpy(man1.name, "안성준");
    strcpy(man1.phoneNum, "010'1122-3344");

    return 0;
}


위의 소스를 아래와 같이 비유할 수 있다.



 붕어빵 기계 틀

 struct person

 타입

 붕어빵

 man

 변수 (메모리를 차지)


  


atoi 함수 예제 소스 // a to i            ascii->int 문자열을 정수형으로 변환

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16

#include <stdio.h> #include <stdlib.h> //atoi함수를 사용하기 위한 헤더 int main() { char str[20]; printf("정수 입력: "); scanf("%s", str); printf("%d \n", atoi(str)); printf("실수 입력: "); scanf("%s", str); printf("%g \n", atof(str)); return 0; }


실수 15.0을 입력하면 정수 15로 출력된다.





typedef을 쓰는 두가지 이유 


typedef unsigned int     size_t;   // 범용의 효과 : int나 short만 바꿔도 모든 size_t의 type이 바뀐다.

typedef unsigned short  size_t;



축약의 효과 

typedef unsigned in uInt;    // ulnt




지역변수와 메모리 Stack


가장 최근의 지역변수가 재사용할 확률이 높다.

메모리의 stack에는 일반적으로 값이 밑에서부터 위로 만들어진다.



넣어진 종이컵을 꺼내려면 나중에 넣은 종이컵부터 꺼내게 되는 것과 같다.


  1. iNum2    //  address : ff9066ac 
  2. str          // ff9066b7
  3. iNum1    // ff9066b0
#include <stdio.h>

int main()
{
    int iNum1=1;
    char str[5];
    int iNum2=2;

    printf("iNum1 : %d \n", iNum1); 
    printf("iNum2 : %d \n", iNum2);

    printf("iNum1 address : %x \n", &iNum1); 
    printf("str address : %x \n", &str);
    printf("iNum2 address : %x \n", &iNum2);

    scanf("%s", str);

    printf("[%s]\n", str); // 문자열 값 그대로 출력 문자열 %s에는 []를 씌우는 것이 좋다. 
    printf("iNum1 : %d \n", iNum1);  // 
    printf("iNum2 : %d \n", iNum2);

    return 0;
}



Output:

1
2
3
4
5
6
7
8
iNum1 : 1 
iNum2 : 2 
iNum1 address : ff9066b0 
str address : ff9066b7 
iNum2 address : ff9066ac 
[]
iNum1 : 1 
iNum2 : 2 






fgets 함수

scanf와 gets는 입력할 수 있는 문자에 제한이 없기에 오버플로우에 취약하다.



가급적이면 fgets를 쓰는 것이 좋다. (int size : 입력받는 값을 제한)


 char *fgets(char *s, int size, FILE *stream);



fgets 예제소스


#include <stdio.h>

void ClearLineFromReadBuffer(void)
{
    while(getchar()!='\n');
}

int main(void)
{
    char perID[7];
    char name[10];

    fputs("주민번호 앞 6자리 입력: ", stdout);
    fgets(perID, sizeof(perID), stdin);
    ClearLineFromReadBuffer();      // 입력버퍼 비우기

    fputs("이름 입력: ", stdout);
    fgets(name, sizeof(name), stdin);

    printf("주민번호: %s\n", perID);
    printf("이름: %s\n", name);
    return 0;
}
       



Output :





728x90