#include<stdio.h>
int main(int argc, char *argv[])
{
int number;
scanf("%d", &number);
printf("Number: %d",number);
return 0;
}
위 코드는 문법적으로 문제가 없지만, 실행하면 VS에서는 에러를 출력한다.
이는 scanf의 취약점(버퍼 오버플로우)때문에
VC 컴파일러가 scanf_s를 대신 사용하라고 경고하는 메시지이다.
이를 해결하기 위해서는 다음 방법들이 있다.
1. scanf_s 대신 사용하기.
#include<stdio.h>
int main(int argc, char *argv[])
{
int number;
scanf_s("%d", &number); // 기존 scanf와 다를것 없음.
printf("Number: %d",number);
return 0;
}
정수나 실수를 입력받을 때는 그냥 scanf와 다를 바 없이 사용하면 된다.
하지만 문자나 문자열을 입력받을 때는 인자가 하나 늘어난다.
#include<stdio.h>
int main(int argc, char *argv[])
{
char ch;
char string[10];
scanf_s("%s", string, sizeof(string));
scanf_s(" %c", &ch, 1);
printf("String: %s\n",string);
printf("Char: %c\n", ch);
return 0;
}
변수 뒤에 입력받을 공간의 크기를 추가로 제공해주어야 한다.
2. #define _CRT_SECURE_NO_WARNINGS
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
int main(int argc, char* argv[])
{
int number;
scanf("%d", &number);
printf("Number: %d", number);
return 0;
}
프로그램 맨 윗줄에 #define _CRT_SECURE_NO_WARNINGS라는 매크로를 추가하면 간단하게 해결된다.
3. #pragma warning(disable:4996)
#pragma warning(disable:4996)
#include<stdio.h>
int main(int argc, char* argv[])
{
int number;
scanf("%d", &number);
printf("Number: %d", number);
return 0;
}
또는 4996 경고를 무시하게 하는 전처리 명령을 추가하면 된다.
여담.
scanf_s는 Visual Studio에만 존재한다고 한다. (비표준)
따라서 Windows 환경에서만 C개발을 할 것이 아니라면 2번이나 3번 방법을 사용하는 게 낫다고 생각한다.
읽을거리.
'개념정리 > C' 카테고리의 다른 글
Scanf 함수 공백처리 (0) | 2021.04.12 |
---|