Adventure of 빠타박스
article thumbnail
728x90
728x90
SMALL

03_ 입력받기

컴퓨터에는 모니터, 스피커 등의 출력 장치가 있는가 하면 키보드, 마우스 등의 입력 장치도 있다.

C언어에서는 기본적으로 모니터를 통해 문자를 출력할 수 있고, 키보드를 통해 사용자로 부터 입력을 받을 수 있다.


3.1 scanf 사용하기

  • 출력할 때 printf를 사용하듯이 입력을 받을 때는 scanf 함수를 사용한다. 사용법도 printf와 거의 비슷

키보드로 부터 두 정수를 입력받아 a, b라는 int형 변수에 저장한 후 a + b의 값을 출력하는 계산기 프로그램이다. (변수 이름 앞에 & 기호가 붙는 것을 주의

(코드 작성시 scanf 보안 에러가 뜰 수 있음 ) _ 이것 소스파일 우클릭해서 설정에서 보안 꺼주면 됨 또는 다른 방법도 있음

#include <stdio.h>

int main()
{
		int a, b;

		scanf("%d%d", &a, &b);
		printf("%d + %d = %d\\n", a, b, a + b);
}

결과 :

입력 - 25 31

25 + 31 = 56

4번째 줄의 scanf 함수가 하는 역할은 공백 등으로 분리된 두 개의 정수(%d)를 키보드로 부터 입력받은 후, 순서대로 a와 b라는 변수에 그 값들을 각각 저장한다.

%d ← &a %d ← &b

scanf함수는 입력되는 형태에 따라 꽤 유연하게 대응한다. 그래서 입력 형식이 그리 중요하지는 않다.

  • %d 두 개를 썻다면 두 정수가 엔터로 구분되어 있어도 되고,
  • 공백으로 구분되어 있어도 되고,
  • 공백 여러개로 구분되어 있어도 된다.

그러나 두 숫자를 아무 구분없이 입력하면 한 정수로 인식이 된다.

예를 들어 2와 3을 입력하고 싶어서 23을 입력해버리면 23이라는 하나의 정수로 인식한다.


3.2 scanf의 서식 지정자

  • 문자를 입력받고 싶다면 %c,
  • 실수를 입력 받고 싶다면 %f
  • scanf가 작동하는 특유의 방식 때문에 double을 입력받을 때는 %lf라는 서식지정자를 사용해야한다.
int a;
char b;
float c;
double d;
scanf("%d", &a);
scanf("%c", &b);
scanf("%f", &c);
scanf("%lf", &d);   // double 을 입력받을 때는 %lf를 사용해야한다!

 

3.3 scanf 함수 관련 보안 문제

  • scanf 함수는 ‘버퍼 오버플로'라는 보안상의 취약점이 있다.실제로 예전에는 이런 취약점을 이용해 해킹을 하기도 했다.여러 사람이 사용할 실용적인 프로그램을 만들어야 한다면 반드시 scanf대신 scanf_s를 써야한다.
  • (기본적으로 Visual studio에서 scanf를 사용을 막아놓았기에 프로젝트를 만들고, SDL검사를 해제했다면 에러는 나지 않을 것이다.)
  • 그래서 입력받을 최대 글자 수를 지정해서 그런일이 발생하지 않게끔 해주는 scanf_s함수가 만들어졌다.
  • = 버퍼 오버플로란? 예상보다 긴 입력이 들어왔을 때 입력받고자 하는 변수의 범위를 벗어나 엉뚱한 변수의 값이 바뀔 수 있는 현상
728x90
728x90
LIST
profile

Adventure of 빠타박스

@PPATABOX

포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!