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
'🅿🆁🅾🅶🆁🅰🅼🅼🅸🅽🅶 > C_C++' 카테고리의 다른 글
[C++과 언리얼로 만드는 MMO] C++ 기초_산술연산자[Section3]{(18)} (5) | 2024.09.13 |
---|---|
[C/C++_Doodle]BookReviewing_02 변수와 연산자 (0) | 2023.01.27 |
[C/C++_Doodle]BookReviewing_01.출력하기 (0) | 2023.01.27 |