본문 바로가기

백준 문제풀이/입출력과 사칙연산

백준 알고리즘 1000 / 단계별로 풀어보기 - 입출력과 사칙연산 6

12월 1일이네요.

시간이 매우 빠른 것 같습니다.

 

오늘은 1000번 문제입니다. 링크는 여기입니다.

https://www.acmicpc.net/problem/1000

 

1000번: A+B

문제 두 정수 A와 B를 입력받은 다음, A+B를 출력하는 프로그램을 작성하시오. 입력 첫째 줄에 A와 B가 주어진다. (0 < A, B < 10) 출력 첫째 줄에 A+B를 출력한다. 예제 입력 1 복사 1 2 예제 출력 1 복사 3 힌트 여기를 누르면 1000번 예제 소스를 볼 수 있습니다....

www.acmicpc.net

입력을 받는 함수는 여러 가지가 있는데요,

그 중 가장 많이 쓰는 scanf 로 하겠습니다.

visual studio 최신버전을 쓰면 scanf 사용 시 디버깅이 안되는 오류가 발생합니다.

 

visual studio scanf 오류

 

warning C4996: 'scanf': This function or variable may be unsafe. Consider using scanf_s instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.
1>c:\program files (x86)\~~~~~\ucrt\stdio.h(1274): note: 'scanf' 선언을 참조하십시오.

 

이런 오류인데요. 이런 증상이 발생하는 이유는 BOF, 버퍼오버플로우 때문입니다.

scanf로 값을 입력받는 상황에서, 변수가 저장할 수 있는 용량 최대치를 넘기는 값을 입력받게 되면, 값이 다른 영역에

침범(overflow) 하게 되면서 프로그램에 악영향을 끼칩니다.

 

스타크래프트1의 EUD 맵들도 버퍼오버플로우를 이용한 것이기도 합니다. (EUD맵들이 악용사례는 아닙니다...)

 

여하튼, visual studio에서는 그러한 일을 방지하고자, scanf_s 사용을 권장하고 있습니다.

 

버퍼오버플로우고 뭐고 그냥 scanf를 쓰는 해결 방법을 알고 싶어하시는 분들을 위해 스크린샷을 통해 자세히 알려드리겠습니다.

 

 

소스 파일 중 하나를 오른쪽 클릭하셔서 속성에 들어갑니다.

 

이렇게요.

 

속성에 들어가셔서 C/C++ 탭을 확장하시면 전처리기 부분이 있습니다.

전처리기를 누르셔서 전처리기 정의로 가셔서 그 부분 맨 끝에 _CRT_SECURE_NO_WARNINGS 를 추가해주시면 됩니다.

 

 

이렇게요.

 

자 이제 오류해결은 끝났고, 문제 푸는 일만 남았습니다.

 

일단 값을 입력받을 변수들을 먼저 선언을 해야겠네요.

변수 선언 시에는 초기화를 해주는 것이 좋습니다. 보통 0으로 하죠.

 

scanf() 함수로 값을 입력받을 수 있습니다. scanf("자료형",변수의 주소); 이런식으로요.

주소는 변수명 앞에 & 를 붙여주면 됩니다.

printf 처럼 변수명이 아니라 주소를 넣어주는 이유는, call by reference 때문인데, 이건 나중에 다루도록 하죠.

 

scanf() 의 자료형 중에서, %d는 double 형이라고 해서, 10진 정수를 의미합니다.

%f(float)는 10진 부동 소수, %c는 단일 문자(character), %s는 문자열(string) 등등 있는데요,

일단 지금은 가장 많이 쓰이는 %d로 해봅시다.

 

코드를 짜면 이런 식으로 되겠네요.

 

#include <stdio.h>

int main()
{
	int A = 0, B = 0;
	scanf("%d %d", &A, &B);
	printf("%d", A + B);
	return 0;
}

 

 

감사합니다.