[C언어] 표준 입력 함수 scanf

라임이·2022년 8월 16일
0

C언어

목록 보기
9/11

해당 C언어 시리즈는 처음 코딩을 접하는 사람들이 쉽게 이해할 수 있도록 작성되었습니다.

표준 입력 함수 scanf

표준 출력 함수로 printf가 있다면 표준 입력 함수로는 scanf가 있습니다.
두 함수 모두 f는 formatted(형식화된)라는 의미를 갖고 있고 printf와 사용 방법이 매우 비슷합니다.

scanf는 데이터의 종류뿐만 아니라 데이터의 자릿수와 입력 형식도 지정해줄 수 있도록 설계되어 있습니다.


서식 지정자(포맷 스트링)

서식 지정자(포맷 스트링)

scanf 역시 printf처럼 서식 지정자(포맷 스트링)를 지원합니다. 서식 지정자는 어떠한 형식으로 데이터를 입력받을지 지정하는 걸 의미합니다.

다음은 위 표의 약어에 대한 원말입니다.

  • %d: decimal(10진법의)
  • %hd: short decimal
  • %o: octal(8진법의)
  • %x: hexadecimal(16진법의)
  • %f: float
  • %lf: long float(double)
  • %c: character(문자)
  • %s: string(문자열: 문자 2개 이상을 뜻함)

사용 형식

scanf("서식 지정자", &데이터를 저장할 변수);

printf 함수에서 특정 변수 또는 데이터의 값을 출력할 때 다음과 같은 형식을 사용했습니다.

printf("서식 지정자", 서식 지정자에 부합하는 출력 대상);

#include <stdio.h>

void main(void)
{
	int number = 3;
   
   printf("%d", number);
}

위에서는 변수의 데이터의 형식에 맞는 서식 지정자를 사용하여 값을 출력했습니다.
scanf는 출력이 아닌 입력을 받는 함수이기에 입력받을 데이터의 형식을 서식 지정자로 명시하고, &와 함께 데이터를 저장할 변수(공간)를 적어줍니다.

#include <stdio.h>

void main(void)
{
	int number;
    
    scanf("%d", &number);
    printf("%d", number);
}

위의 코드를 실행하고 10진 정수를 데이터로 입력하면 입력한 데이터가 그대로 출력되는 걸 볼 수 있습니다.

SDL(Security Development Lifecycle) 검사

해당 포스트의 코드를 그대로 옮겨 실행했을 뿐인데 Visual Studio에서 C4996라는 오류를 발생시켜 놀라셨을 겁니다. Visual Studio 2019 이상의 버전부터는 보안상 취약할 수 있는 함수를 보완하여 만든 _s가 붙은 함수를 사용하도록 강제하고 있습니다.

하지만 _s가 붙은 함수는 기존의 함수와 사용 방법 다르고 무엇보다 Microsoft에서 지원하는 비표준 함수이기 때문에 우리는 _s가 붙지 않은 표준 함수를 학습할 겁니다.

SDL 검사를 무시하는(끄는) 방법은 다음과 같습니다.

방법 1. #define _CRT_SECURE_NO_WARNINGS

CRT는 C Run-Time Libraries의 약어입니다.
CRT 라이브러리에는 기존 함수의 보안 문제를 해결할 함수가 정의되어 있으므로 해당 함수를 사용하라고 경고하는데 NO_WARNINGS, 경고하지 말라고 컴파일러에게 알리는 겁니다.

해당 명령문을 소스 코드의 첫 줄에 적어주면 됩니다.

방법 2. #pragma warning(disable:4996)

#pragma warning은 컴파일러가 경고를 표시하는 방법을 제어하는 명령문입니다.
#pragma warning(disable:4996)를 소스 코드의 첫 줄에 적으면 오류 코드 4996을 disable, 출력하지 않겠다는 의미를 갖게 됩니다.

방법 3. 프로젝트 속성 변경

개인적으로 이 방법을 가장 선호합니다. 방법 1과 방법 2는 소스코드를 작성할 때마다 작성해 줘야 하지만, 방법 3은 동일 프로젝트라면 설정 변경 한 번만 해주면 끝이기 때문이죠.

따로 설정을 변경하지 않았다면 우측 솔루션 탐색기에 현재 사용 중인 프로젝트가 보입니다. 위 사진 기준 솔루션 밑에 들여 쓰기로 써져있는 CStudyGroup, PPT가 프로젝트입니다.

설정을 변경할 프로젝트를 우클릭하고 속성에 들어갑니다.

위와 같은 창이 뜨면 구성 속성 > C/C++ > 일반 탭으로 들어가 SDL 검사를 아니요로 변경합니다. 변경이 완료되었다면 적용 > 확인을 누르면 끝입니다.

주의사항 1: 입력값의 구분

scanf는 Space, Tab, Enter를 기준으로 입력값의 끝을 구분합니다.

#include <stdio.h>

void main(void)
{
	int number;
    
    scanf("%d", &number);
    printf("%d", number);
}
입력: 10 3
출력: 10

입력 데이터로 '10 3'을 넣었습니다. 10과 3 사이에는 공백(Space)이 존재하기 때문에 컴퓨터는 10과 3, 총 2개의 데이터를 입력했다고 인식합니다. 때문에 첫 번째 입력 데이터인 10이 변수 number에 저장되고 출력값으로 10이 나오게 됩니다.

주의사항 2: 서식 지정자와 자료형의 일치

서식 지정자는 입력받는 데이터의 형식을 의미하고, 입력된 데이터는 & 뒤에 오는 변수에 저장됩니다.

#include <stdio.h>

void main(void)
{
	int number;
    
    scanf("%f", &number);
}

위 코드에서 변수 number는 10진 정수를 저장할 수 있는 int 자료형으로 선언되어 있습니다. 하지만 scanf에서는 실숫값을 입력받아 int형 변수인 number에 저장하겠다고 되어 있습니다. 정수형 변수는 정수만, 실수형 변수는 실수만 저장할 수 있기 때문에 위 코드는 오류가 발생하게 됩니다.

항상 입력 데이터 형식과 저장되는 변수의 자료형을 일치시켜줘야 합니다.

profile
백엔드 개발이 즐거운 4학년 컴공생

0개의 댓글