본문 바로가기

Programming Language/C

기본 입출력

1. scanf()

1.1. scanf()가 뭔데?

scanf()는 사용자로부터 데이터를 입력 받아 특정한 변수에 값을 넣기 위해서 사용됩니다. C프로그래밍을 처음 배울 때 자주 사용되는 프로그램 입력 방식이지만 Visual Studio에서는 scanf()를 취약한 함수로 분류해 놓았기 때문에 사용이 제한됩니다.
따라서 Visual Studio에서 scanf()를 사용하려면 "이 함수가 취약하다는 것을 알지만 난 사용할래"라고 코드 내에 명시해주어야 합니다. 아래와 같이 코드 최상단에 #define _CRT_SECURE_N0_WARNINGS 한 줄만 추가해주면 오류가 발생하지 않습니다.

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>

int main(void) {

}

1.2. 주소 연산자와 형식 지정자

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>

int main(void) {
    int a;
    scanf("%d", &a);
    printf("입력한 숫자는 %d입니다. \n", a);
    system("pause");
    return 0;
}

 

결과:

1
입력한 숫자는 1입니다.
계속하려면 아무 키나 누르십시오 . . .

위 코드를 보면 코드 안에 %와 &가 있습니다. 두 개의 기호는 무슨 역할을 하는 것일지 알아보겠습니다.

1.2.1. 주소 연산자

scanf()를 이용할 때 &는 특정한 변수의 주소를 찾을 때 사용하는 주소 연산자라고 합니다. 즉, &뒤에 적힌 것은 특정한 변수의 주소라고 볼 수 있습니다. 실제로 컴퓨터는 특정한 메모리 주소에 접근해서 데이터를 수정하기 때문에 &를 이용하는 것입니다.
컴퓨터가 데이터를 특정한 메모리 주소에 쓰려면 메모리 주소에 얼마만큼의 크기로 데이터를 쓸지 결정해야 합니다. 이 때 사용하는 것이 형식 지정자입니다.

1.2.2. 형식 지정자

형식 지정자 입력 받을 수 있는 크기 특성
int 4 Bytes %d를 이용해서 정수형 데이터를 입력 및 출력
longlong 8 Bytes %lld를 이용해서 큰 정수형 데이터를 입력 및 출력
double 8 Bytes 입력 시 %lf, 출력 시 %f로 큰 실수형 데이터를 처리
float 4 Bytes %f를 이용해서 실수형 데이터를 입력 및 출력
string 무제한 %s를 이용해서 문자열 데이터를 입력 및 출력
char 1 Byte %c를 이용해서 문자 데이터를 입력 및 출력
  • double형 데이터가 입력 받을 때는 %lf로 받고, 출력할 때는 %f를 사용하는 이유는?
    입력 받을 때는 특정 주소에 특정 크기만큼 입력을 수행하지만, 출력 시에는 주소가 아닌 값 자체를 이용해 출력하기 때문에 구체적인 크기를 지정하지 않아도 괜찮습니다.
  • %자체를 문자로 출력하려면 %%라고 작성하면 됩니다.

2. scanf()를 활용한 다양한 예제

2.1. 실수형 데이터를 입력 받아 소수점 둘째 자리까지 출력하기

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>

int main(void) {
    double a;
    scanf("%lf", &a);
    printf("%.2f\n", a);
    system("pause");
    return 0;
}

 

결과:

5.123456
5.12
계속하려면 아무 키나 누르십시오 . . .

%.2f를 사용해서 소수점 셋째 자리에서 반올림할 수 있도록 만들었습니다. 마찬가지로 %.3f를 사용하면 소수점 넷째 자리에서 반올림하여 소수점 셋째 자리까지 출력이 됩니다.

2.2. 두 숫자를 입력 받아 순서 바꾸어 출력하기

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>

int main(void) {
    int a, b;
    scanf("%d %d", &a, &b);
    printf("%d %d\n", b, a);
    system("pause");
    return 0;
}

 

결과:
7 8
8 7
계속하려면 아무 키나 누르십시오 . . .

%d를 통해서 정수형 데이터 2개를 입력 받았습니다. 구분은 띄어쓰기로 합니다. 주소 a와 주소 b에 각각 사용자의 입력 순서대로 입력을 받았으니 출력 시 단순히 순서만 바꾸어 printf()함수로 출력해주면 사용자가 직접 입력한 순서와 반대로 출력할 수 있습니다.

2.3. 한 자리씩 끊어서 입력받기

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>

int main(void) {
    int a, b, c;
    scanf("%1d %1d %1d", &a, &b, &c);
    printf("%d %d %d\n", a, b, c);
    system("pause");
    return 0;
}

 

결과:
123
1 2 3
계속하려면 아무 키나 누르십시오 . . .

%1d를 사용해서 한 자리씩 끊어서 보여줄 수 있습니다. %1d가 아닌 %2d를 사용한다면 2자리씩 끊어서 보여줍니다.