scanf() 함수
- 콘솔창으로부터 사용자의 입력을 받아오는 함수
#include<stdio.h>
int main()
{
int i = 0;
scanf("%d", &i); // & : ampersand
printf("Value is %d\n", i);
return 0;
}
* 콘솔창에 아무숫자나 입력하면 printf()함수가 출력해준다.
* f : formatted의 약자로 형식을 맞춰 나타낸다는 뜻
* 포매팅(formating) : %~, ~ 부분에 뭐가 들어가는지 형식을 지정해주는 것.
"%d" : scanf 함수에서는 입력을 어떻게 받을지, printf함수에서는 출력을 어떻게 할지 formating 해주고 있다.입력과 출력을 d(decimal, 10진수)로 받겠다고 포매팅해주고 있다.
* &(ampersand) : 변수의 주소를 알고 싶을 때 사용. 사용자가 콘솔창에 입력 했을 때 변수가 아닌 변수의 주소를 넘겨줘서 scanf함수가 주소를 통해 메모리에 직접 접근해서 변수의 값을 바꿔버린다. C언어에서는 변수 자체를 넘겨주는 경우가 없다.)
* C문법에서는 함수의 출력이 1개만 된다. scanf함수에서 변수 여러개의 입력을 받고 그 값을 바꿔줘야하는데 그것을 출력 할 수 없기 때문에 변수에 주소를 통한 접근법을 사용한다.
에러코드 'use _CRT_SECURE_NO_WARNINGS' 없애는 방법 2가지
* 비주얼스튜디오를 마이크로소프트에서 사용하면 에러코드가 뜬다. 비주얼코드에선 오류 없이 컴파일 된다.
* 에러코드 나는 이유 : 변수앞에 & 사용시 사용자가 콘솔창에 입력하면 그 주소에 해당하는 메모리의 값을 입력받는다.
MS에서 VS용 C/C++ 컴파일러를 만들 때, 특정 경우에 사용자에게 입력받은 것을 해당하지 않는 다른 주소들의 메모리들까지 입력해버리면서 보안의 위험이 생긴다. MS 입장에서 해킹 위험이 있는 scanf함수 대신 scanf_s함수를 사용 하기 원한다는 의미로 에러코드( _CRT_SECURE_NO_WARNINGS)가 발생한다.
Windows용 소프트웨어를 개발 할 때는 scanf함수 대신 scanf_s함수를 사용해도 좋다.
1. 전처리기 #define 사용해서 에러코드 잡기
- #define _CRT_SECURE_NO_WARNINGS : use 뒤에 에러내용 복사해서 define 뒤에 붙여넣기
- 전처리기로 에러코드를 잡을 경우 gcc와 호환이 안된다는 단점이 있다.
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
int main()
{
int i = 0;
scanf("%d", &i); // & : ampersand
printf("Value is %d\n", i);
return 0;
}
2. 설정 바꿔주기
- 설정에 ;_CRT_SECURE_NO_WARNINGS 추가하기
프로젝트소스파일 우클릭 - Properties 클릭 - Configuration:Debug모드 선택 , C/C++ preprocessor 클릭, PreprocessorDefinitions에서 맨 뒷부분에 ;써주기, use뒤에 에러내용 복사해서 ;뒤에 붙여넣기 - OK
- 지금은 Debug모드로 사용하지만 자료구조 알고리즘 등 다른 공부 할 땐 Release모드로 사용하기 때문에 두 모드에 모두 설정을 해줘야 서로 다르게 작동하지 않는다.
- 설정을 바꾸는 방법은 코드창이 깔끔해보이는 장점이 있다. 홍교수님 추천 방법!
'프로그래밍언어 > C언어' 카테고리의 다른 글
[C language] 정수와 실수 (0) | 2020.12.09 |
---|---|
[C language] 간단한 입출력 프로그램 만들기 (0) | 2020.12.02 |
[C language] 변수와 상수 (0) | 2020.11.22 |
[C language] 데이터와 자료형 (0) | 2020.11.22 |
[C language] 읽기 좋은 코드를 만드는 요령 (0) | 2020.11.20 |