입력한 데이터를 연산이 가능한 정수나 실수로 사용하려면 변환과정이 필요하다. 이때 사용하는 것이 scanf 함수. (scan formatted)
scanf 에서의 변환 문자는 (%d, %lf, ...) printf 함수로 출력할 때 사용하는 변환 문자과 거의 같다.
scanf 함수는 키보드에서 입력한 값을 변수에 저장할 때 사용.
scanf("%d", &a);
scanf 함수와 같이 메모리에 직접 접근하는 함수를 사용하면 비주얼스튜디오 컴파일러는 시스템 보안 문제 때문에 에러 메세지를 보여주고 컴파일을 중단합니다. 이런 문제로 시스템 보안 검사 기능을 제한하는 문장을 넣은 템플릿을 사용하거나 소스코드의 첫줄에 다음 문장을 추가하고 컴파일 하여야한다.
' #define _CRT_SECURE_NO_WARNINGS '
혹은 보안성을 더 높인 scanf_s 함수를 이용한다. (버퍼 오버런 문제를 방지)
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
int main(void)
{
int a;
scanf("%d",&a);
printf("입력된 값 : %d\n", a);
return 0;
}
short형 변수에 입력할 때 %d 를 쓰면 에러가 뜬다. 왜냐하면 short형은 2바이트를 저장공간으로 쓰는데 scanf("%d", &변수)로 되면 %d는 변수의 시작주소로 부터 4바이트의 값을 입력하게 한다. 따라서 short형을 쓸때의 변환문자는 %hd 로 써야한다.
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
int main(void)
{
int age;
double height;
printf("나이와 키를 입력하세요 : ");
scanf("%d%lf", &age, &height);
printf("일력하신 나이는 %d살, 키는 %.1lfcm입니다. \n", age, height);
return 0;
}
char형 변수에 문자를 입력할 때는 키보드로 입력하는 모든 문자가 대상이 된다. 숫자, 문자, 스페이스 바(공백 문자), 엔터(개행 문자)도 하나의 문자로 전달된다. 문자열은 char 배열에 %s 변환 문자를 사용해 입력하는데, 문자열을 입력할 때는 배열명에 &을 붙이지 않는다. 또한 스페이스나 엔터, 탭 등을 만다면 바로 전까지만 저장되므로 공백 없이 연속으로 입력해야 한다.
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
int main(void)
{
char grade;
char name[20]; // 배열의 크기가 20바이트 이므로 최대 19자의 문자열을 입력할 수 있다. 한글은 한 자당 2바이트
printf("학점 입력 : ");
scanf("%c", &grade);
printf("이름 입력 : ");
scanf("%s", name); // name 배열에 이름 문자열 입력, &를 사용하지 않는다!!
printf("%s의 학점은 %c입니다.\n", name, grade);
return 0;
}
배열의 크기보다 큰 문자열을 입력하면 프로그램이 비정상적으로 종료될 수 있다. 더 큰 문자열로 입력하면 다른 변수의 저장 공간을 침범할 수 있기 때문. 그래서 비주얼스튜디오는 scanf_s 함수의 사용을 권장한다. 이 함수는 배열의 크기까지만 문자열을 입력하도록 제한하므로 안전한 입력이 가능하다. 그러나 다른 컴파일러를 부득이하게 사용하게 되는 경우 이 함수를 지원하지 않는 경우도 있을 수 있다. scanf 뿐만 아니라 get, strcpy 등의 함수를 사용할 때도 이와같은 에러를 볼 수 있다.
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
int main(void)
{
char ch;
printf("문자 입력 : ");
scanf("%c", &ch);
printf("%c문자의 아스키 코드 값은 %d입니다.", ch, ch);
return 0;
}