생선이의 잡다한 블로그

C언어 강좌 9 - scanf 로 입력을 받아보자 본문

프로그래밍/C언어 강좌

C언어 강좌 9 - scanf 로 입력을 받아보자

생선스프 2017. 4. 4. 20:30
반응형

안녕하세요 생선스프입니다!


이번에는 드디어 입력을 받아보도록 하겠습니다!


입력을 받는데는 여러가지 함수가 있습니다


scanf gets 등등..


그 중 저희는 먼저 scanf 를 다뤄보도록 하겠습니다


C언어 강좌 11 - gets로 입력을 받아보자!


scanf는 형태가 printf와 비슷합니다


scanf("입력받을형태",입력받을공간의주소)


이렇습니다


우선 아래의 예제를 보도록하겠습니다


1
2
3
4
5
6
7
8
9
10
11
#include <stdio.h>
 
void main()
{
    int num;
 
    printf("정수 입력 : ");
    scanf("%d"&num);
    
    printf("입력된 정수 : %d", num);
}
cs


이렇게 입력을 한 뒤 실행결과를 보면


이렇게 작동하는 것을 확인할 수 있습니다


이를 통해 알 수 있는것은 

scanf("%d"&num);
여기서 %d 정수를 입력받는 형태이고, &num num의 주소라는 것을 알 수 있습니다


변수의 앞에 & 이 붙으면 그 변수의 주소를 나타내게 됩니다


그리고 %d 를 여러개 써줄수도 있습니다


아래 예제를 보겠습니다


1
2
3
4
5
6
7
8
9
10
11
12
#include <stdio.h>
 
void main()
{
    int num1;
    int num2;
 
    printf("정수 입력 : ");
    scanf("%d%d"&num1, &num2);
 
    printf("입력된 정수 : %d, %d", num1, num2);
}

cs


그리고 숫자를 두개 입력해주는데 두개의 구분은 스페이스나 탭 같은 공백으로 지어줍니다


그러면 아래와 같이 결과가 나옵니다

즉 공백을 기준으로 순서대로 값이 들어간다는것이죠


%d

정수 

%f 

실수 

%c 

단일문자 

%s 

문자열 


아마 다들 어떻게 해야하는지 알 수 있을겁니다

하지만 여기서 중요한 것이 있습니다


문자열을 입력받을때입니다


아래 소스를 보도록 하겠습니다

1
2
3
4
5
6
7
8
9
10
11
#include <stdio.h>
 
void main()
{
    char ch[20];
 
    printf("문자열 입력 : ");
    scanf("%s",ch);
 
    printf("%s",ch);
}
cs


위의 코드를 보면 우선 ch앞에 & 이 없는것을 알 수 있습니다

하지만 오류없이 잘 작동된다는 말은 ch는 주소라는 것이죠


여기서 저희는 배열인경우에는 배열의 시작지점의 주소가 변수에 들어간다는 것을 알 수 있습니다


근데 여기서 중요한 사실이 있습니다


저희는 20바이트 만큼의 공간을 만들었는데 여기다가 20바이트 이상을 집어넣으면..?


이렇게 에러가 뜨게됩니다

하지만 에러는 뜨지만 아래 값이 나오는걸 보아 어찌됬건 들어가긴 했다는 겁니다


하지만 이는 위험합니다

이렇게 크기를 넘어가버리면 정해진 범위안을 벗어나서 값이 램에 저장되게 되고

이것이 다른 프로그램의 영역에 침범해서 값을 바꾸어 버릴수도 있습니다


즉 버퍼오버플로우가 발생하는 것이죠


그래서 저는 scanf_s 를 사용할 겁니다


강좌 처음시작할때 SDL 검사를 끄라고는했는데 저는 보통 켜둔상태에서 코딩을 합니다

그렇게 되면 scanf는 안전하지 않은 함수로 사용이 불가능해 지죠


그럼 scanf_s 는 어떻게 사용할까요



scanf("입력받을 형태",입력받을 공간의 주소,입력받을 값의 크기)


이렇게 입력받을 값의 크기를 정해줄 수 있습니다


아래의 예제가 있습니다

1
2
3
4
5
6
7
8
9
10
11
#include <stdio.h>
 
void main()
{
    char ch[20];
 
    printf("문자열 입력 : ");
    scanf_s("%s",ch,sizeof(ch));
 
    printf("%s",ch);
}
cs


C언어 강좌 8 - 자료의 크기를 구해보자!

sizeof를 이용하여 ch의 크기를 구해줍니다

아니면 그냥 ch의 크기인 20을 적어도 되긴하는데 나중에 ch크기가 바뀔수도 있으니 sizeof를 사용합니다


이제 버퍼오버플로우를 발생시키려하면


이렇게 값이 입력되지 않습니다


그리고 scanf_s에서 정수형태가 아닌 다른형태의 변수를 입력받을때는 sizeof를 안적어주어도 작동하지만

문자열의 경우 작동하지 않습니다


그럼 이번 강좌는 여기까지 하도록 하겠습니다

강좌 읽어주셔서 감사합니다!


공감과 댓글은 생선에게 힘이됩니다!

더 많은 C언어 강좌

반응형
Comments