Skip to content

6. 표준 입출력(Standard Input/Output)


1. 키워드

  • 표준 입출력(Standard Input/Output)


2. 입력 값을 변수에 저장하기

  • 콘솔에서 입력하는 방식을 표준 입력, 출력하는 방식을 표준 출력이라 한다.


  • 먼저 scanf 함수를 사용하여 표준 입력으로 사용자의 입력을 받아보자.


#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


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


  • 다음과 같이 scanf 함수의 첫 번째 인수에는 ""안에 서식 지정자를 넣어서 입력 받을 값의 형태를 설정한다.
  • 그리고 두 번째 인수에는 입력 값을 저장할 변수를 넣는데, 여기서 주의할 점은 &num1처럼 변수 앞에 &를 붙여주어야 한다는 것이다.


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


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


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


  • 맨 처음 #define _CRT_SECURE_NO_WARNINGS는 Visual Studio에서만 넣어주면 되며, 리눅스나 OSX 사용자라면 넣지 않아도 된다.
  • scanf 함수는 나온 지 오래된 함수라 입력 값의 길이를 설정할 수가 없다.
  • 따라서 보안에 취약하기 때문에 Visual Studio에서는 사용하지 말라는 경고가 출력되고 컴파일 에러가 발생한다.


#define _CRT_SECURE_NO_WARNINGS

  • #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++) 전용이다.


표준 입력, 표준 출력

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


3. 한 번에 정수 두 개 입력 받기

  • 이번에는 값을 두 개 입력 받아서 변수 두 개에 저장해 보자.


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

int main()
{
    int num1, num2;

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

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

    return 0;
}

// 정수를 두 개 입력하세요: 1 2 (입력)
// 1 2


  • 입력 값 두 개가 num1, num2 변수에 각각 저장된다.
  • 그리고 printf 함수를 통해 num1, num2의 값이 출력된다.
  • scanf 함수는 printf 함수와 사용 방법이 유사하다.
  • 입력 받을 개수만큼 서식 지정자를 넣어주고, 서식 지정자 개수만큼 변수를 넣어주면 된다.


4. 실수 입력 받기

  • 이번에는 실수를 받아서 변수에 저장해 보자.


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

int main()
{
    float num1;

    printf("실수를 입력하세요: ");
    scanf("%f", &num1); // 실수를 입력 받아서 변수에 저장

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

    return 0;
}

// 실수를 입력하세요: 1.1 (입력)
// 1.100000


  • 실수를 입력 받을 것이므로 변수는 float 타입으로 선언해 주고, scanf에 서식 지정자로 %f를 설정해 준다.
  • 즉, 입력 받고자 하는 자료형에 맞게 변수를 선언하고, 서식 지정자도 맞춰준다.
  • 만약 정수 1을 입력하더라도 서식 지정자가 %f이고 float 타입 변수에 저장되므로 1.0이 된다.


  • 여기서 변수를 double 타입으로 선언했다면 scanf에는 서식 지정자로 %lf를 넣고, long double 타입으로 선언했다면 %Lf를 넣는다.
  • 참고로 double 타입은 printf로 출력할 때 %f를 써도 되지만, scanf%lf를 써야 한다.


double num1;
scanf("%lf", &num1); // 자료형이 double 타입일 때는 %lf

long double num2;
scanf("%Lf", &num2); // 자료형이 long double 타입일 때는 %Lf


5. 문자 입력 받기

  • 숫자뿐만 아니라 문자도 입력 받을 수 있다.


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

int main()
{
    char c1;

    printf("문자를 입력하세요: ");
    scanf("%c", &c1); // 문자를 입력 받아서 변수에 저장

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

    return 0;
}

// 문자를 입력하세요: a (입력)
// a


  • 마찬가지로 문자를 입력 받을 것이므로 변수는 char 타입으로 선언해 주고, scanf에 서식 지정자로 %c를 설정해 준다.
  • scanf에서 %c는 문자 한 개만 입력 받을 수 있으므로, 문자를 여러 개 입력해도 첫 번째 문자 한 개만 저장되고 나머지는 모두 무시된다.


getchar로 문자 입력 받기

  • scanf 함수 대신 getchar 함수를 사용해도 문자를 입력 받을 수 있다.


#include <stdio.h>

int main()
{
    char c1 = getchar(); // 문자 하나를 입력 받음

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

    return 0;
}

// a (입력)
// a


  • getchar 함수는 표준 입력에서 문자 하나를 입력 받은 뒤 결과를 반환한다.
  • 만약 문자 여러 개를 입력해도 첫 번째 문자만 반환된다.


  • getchar 함수에 대응하는 함수로 putchar가 있는데 이 함수는 문자 하나를 화면에 출력한다.


#include <stdio.h>

int main()
{
    char c1 = 'a';

    putchar(c1); // a

    return 0;
}


  • getchar, putchar 함수 모두 stdio.h 헤더 파일에 선언되어 있다.

References