11 입력 값을 변수에 저장하기

Windows나 macOS처럼 GUI 화면이 나오는 프로그램은 마우스와 키보드를 사용하여 입력을 받습니다. 하지만 C 언어를 배울 때는 콘솔(터미널, 명령 프롬프트)에서 글자만 입출력 하게 되죠. 이렇게 콘솔에서 입력하는 방식을 표준 입력(standard input, stdin), 출력하는 방식을 표준 출력(standard output, stdout)이라 합니다

11.1 정수 입력받기

먼저 scanf 함수를 사용하여 표준 입력으로 사용자의 입력을 받아보겠습니다(stdio.h 헤더 파일에 선언되어 있습니다). 다음 내용을 소스 코드 편집 창에 입력하세요.

  • scanf(서식, 변수의주소);
    • int scanf(char const * const _Format, ...);
    • 성공하면 가져온 값의 개수를 반환, 실패하면 EOF(-1)를 반환

scanf_integer.c

#define _CRT_SECURE_NO_WARNINGS    // scanf 보안 경고로 인한 컴파일 에러 방지
#include <stdio.h>

int main()
{
    int num1;

    printf("정수를 입력하세요: ");
    scanf("%d", &num1);    // 표준 입력을 받아서 변수에 저장

    printf("%d\n", num1);    // 변수의 내용을 출력

    return 0;
}

소스를 컴파일하여 실행하면 "정수를 입력하세요: "만 출력됩니다. 이 상태에서 1을 입력하고 엔터 키를 누르세요.

실행 결과

정수를 입력하세요: 1 (입력)
1

입력한 값이 그대로 출력됩니다. scanf 함수는 표준 입력을 받아서 변수에 값을 저장하는 함수입니다.

다음과 같이 scanf 함수의 첫 번째 인수에는 큰따옴표 안에 서식 지정자를 넣어서 입력받을 값의 형태를 설정합니다. 그리고 두 번째 인수에는 입력 값을 저장할 변수를 넣습니다. 여기서 주의할 점은 &num1처럼 변수 앞에 &를 붙여주어야 한다는 점입니다(왜 &를 붙여야 하는지는 'Unit 48 함수에서 포인터 매개변수 사용하기'에서 자세히 설명하겠습니다).

//     ↓ 첫 번째 인수
scanf("%d", &num1);    // 표준 입력을 받아서 변수에 저장
//            ↑ 두 번째 인수

scanf 함수로 입력 값을 변수에 저장한 뒤 printf 함수로 다시 화면에 출력하였습니다. 그래서 입력한 그대로 값이 출력되는 것을 볼 수 있습니다.

printf("%d\n", num1);    // 변수의 내용을 출력

맨 처음 #define _CRT_SECURE_NO_WARNINGS는 Visual Studio에서만 넣어주면 됩니다(리눅스, macOS 사용자라면 넣지 않아도 됩니다). scanf는 나온 지 오래된 함수라 입력 값의 길이를 설정할 수가 없습니다. 따라서 보안에 취약하기 때문에 Visual Studio에서는 사용하지 말라는 경고가 출력되고 컴파일 에러가 발생합니다. 하지만 여기서는 C 언어를 배우는 과정이므로 scanf 함수를 그대로 사용하겠습니다.

참고

#define _CRT_SECURE_NO_WARNINGS를 넣지 않고 scanf 함수를 사용하면 다음과 같이 컴파일 에러가 발생합니다.

scanf_integer.c(8): error 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)\windows kits\10\include\10.0.10150.0\ucrt\stdio.h(1270): note: 'scanf' 선언을 참조하십시오.

scanf_s 함수를 대신 사용하거나 _CRT_SECURE_NO_WARNINGS를 사용하라고 나옵니다. scanf_s 함수는 입력 값의 길이를 설정할 수 있지만 C 언어 표준 함수는 아니며 Visual studio(Visual C++) 전용입니다. 

참고 | 표준 입력, 표준 출력

콘솔에서는 키보드 입력이 표준 입력이고, 콘솔에 글자를 보여주는 것이 표준 출력입니다. 표준 입력과 표준 출력의 형태는 정해져 있지 않고 설정하기에 따라 달라집니다. 즉, 리다이렉션(<, >)과 파이프(|)라는 것을 사용하면 파일의 내용을 표준 입력으로 보낼 수도 있고, 표준 출력을 파일로 저장할 수도 있습니다.