본문 바로가기

공부/C언어

C언어 - (5) : printf / scanf

'printf' 함수 정리

Escape Character

간단한 예시의 printf문을 살펴보자면,

`printf("앞집 강아지가 말했다. "멍! 멍!" 정말 귀엽다");` 라는 printf문의 경우는 올바른 printf문으로 볼 수 없다.

큰 따옴표가 여러개 존재하다보니, 어떤 부분을 출력해야 하는지 컴파일러가 제대로 인식할 수 없기 때문이다.

 

따라서, 올바르게 위의 예시를 출력하기 위해서는

`printf("앞집 강아지가 말했다. \"멍! 멍!\" 정말 귀엽다");`와 같이, 그대로 출력해야하는 큰 따옴표 앞에 back slash를 붙여주어야한다.

 

이렇게 \(back slash)와 특정 문자를 조합해서 사용하는 경우를 escape character라고 하는데, 대표적인 종류는 다음과 같다.

Escape Character 의미하는 바
\a 경고음
\b 백스페이스
\f 폼 피드(form feed)
\n 개행(new line)
\r 캐리지 리턴(carriage return)
\t 수평 탭
\v 수직 탭
\' 작은 따옴표 출력
\" 큰 따옴표 출력
\? 물음표 출력
\\ back slash 출력

모두 다 알고 있으면 좋겠지만, 자주 쓰이는`\n, \t, \', \"` 정도는 반드시 숙지하고 있자

서식 문자

자주 사용되는 `%d, %f`와 같은 문자를 '서식 문자'라고 한다.

서식 문자의 종류는 다음과 같다.

서식 문자 출력 대상(자료형) 출력 형태
%d char, short, int 부호 있는 10진수 정수
%ld long 부호 있는 10진수 정수
%lld long long 부호 있는 10진수 정수
%u unsigned int 부호 없는 10진수 정수(양수만)
%o unsigned int 부호 없는 8진수 정수(양수만)
%x, %X unsigned int 부호 없는 16진수 정수(양수만)
%f float, double 10진수 방식의 부동소수점 실수
%Lf long double 10진수 방식의 부동소수점 실수
%e, %E float, double e또는 E 방식의 부동소수점 실수
%g, %G float, double 값에 따라 %f와 %e 사이에서 적절한 것 선택
%c char, short, int 값에 대응하는 문자
%s char* 문자열
%p void* 포인터의 주소 값

추가적으로, `%o, %x. %X`에서 #을 삽입하면 8진수 앞에는 '0' , 16진수 앞에는 '0x'가 추가로 붙는다.

#include <stdio.h>
int main(void)
{
    int num1=7, num2=13;
    printf("%o %#o \n", num1, num1); // 7 07 
    printf("%x %#x \n", num2, num2); // d 0xd 

    return 0;
}

 

`%f`, `%e`의 차이는 다음과 같다.

#include <stdio.h>
int main(void)
{
    printf("%f \n", 0.1234); // 0.123400 
    printf("%e \n", 0.1234); // 1.234000e-01 
    printf("%f \n", 0.12345678); // 0.123457 
    printf("%e \n", 0.12345678); // 1.234568e-01 

    return 0;
}

cf) $1.0 \times 10^{-20} = 1.0e-20$

 

`%g`는 실수의 형태에 따라서 `%f`와 `%e`사이에서 적절한 형태로 출력한다

(`%g`와 `%G`차이는 e표기법의 e의 대소문자 여부이다.)

#include <stdio.h>
int main(void)
{
    double d1=1.23e-3;
    double d2=1.23e-4;
    double d3=1.23e-6; 
    double d4=1.23e-5;

    printf("%g \n", d1); // 0.00123 
    printf("%g \n", d2); // 0.000123 
    printf("%g \n", d3); // 1.23e-05 
    printf("%g \n", d4); // 1.23e-06 
    
    // 일정 수준 이상 소수 부분이 길어지는 경우 e표기법을 사용하는 것으로 추측할 수 있음

    return 0;
}

 

서식 문자를 사용해, 출력되는 문자의 폭을 지정해서 출력하는 것도 가능하다.

#include <stdio.h>
int main(void)
{
    printf("%-8s %14s %5s \n", "이 름", "전공학과", "학년");
    printf("%-8s %14s %5s \n", "김동수", "전자공학", "3");
    printf("%-8s %14s %5s \n", "이을수", "컴퓨터공학", "2");
    printf("%-8s %14s %5s \n", "한선영", "미술교육학", "4");
    /*
    이 름    전공학과 학년 
    김동수   전자공학     3 
    이을수 컴퓨터공학     2 
    한선영 미술교육학     4 
    */

    return 0;
}

예시로, `%8d`의 경우에는 8칸을 확보하고 오른쪽으로 정렬해 출력하는 것이고, `%-8d`는 8칸을 확보하고 왼쪽으로 정렬해 출력하는 것으로 정리할 수 있다.

'scanf' 함수 정리

문자의 입력에 사용하는 'scanf'함수에서 필요한 정보는 두가지이다

  • 입력의 형식
    • 어떤 타입의 데이터를 입력받을 것인가
    • 서식 문자 사용(ex : `%d`)
    • 서식 문자의 사용은 printf함수에 사용되는 서식 문자와 유사하다
  • 입력의 장소
    • 어느 메모리 공간에 입력 데이터를 저장할 것인가
    • 메모리 포인터 사용(ex : `&num1`)
#include <stdio.h>
int main(void)
{
    int num1, num2, num3;
    printf("세 개의 정수 입력: ");
    scanf("%d %o %x", &num1, &num2, &num3);
    // 세 개의 정수 입력: 12 12 12
    printf("입력된 정수 10진수 출력: ");
    printf("%d %d %d \n", num1, num2, num3);
    // 입력된 정수 10진수 출력: 12 10 18 

    return 0;
}

 

서식 문자의 사용에서 `printf`함수와 `scanf`함수의 다른 점이라면,

`printf`에서는 %f, %e, %g의 의미가 각각 달랐지만, `scanf`에서는 셋 다 'float형 데이터를 입력 받겠다'라는 동일한 의미를 가진다.

 

추가적으로, 실수형 데이터에 대해서는 `printf`와 `scanf`의 서식 문자 사용의 차이가 존재하는데,

  `printf`에서의 서식문자 `scanf`에서의 서식문자
float %f %f
double %f %lf
long double %Lf %LF

`printf`는 float와 double을 서식 문자 내에서 구분하지 않지만, `scanf`는 각각 다른 서식 문자를 갖는다고 암기하면 좋을 것 같다.

#include <stdio.h>
int main(void)
{
    float num1;
    double num2;
    long double num3;
    printf("실수 입력1(e 표기법으로): ");
    scanf("%f", &num1); // float 입력 : %f
    printf("입력된 실수 %f \n", num1); // float 출력 : %f

    printf("실수 입력2(e 표기법으로): ");
    scanf("%lf", &num2); // double 입력 : %lf
    printf("입력된 실수 %f \n", num2); // double 출력 : %f

    printf("실수 입력3(e 표기법으로): ");
    scanf("%Lf", &num3); // long double 입력 : %Lf
    printf("입력된 실수 %Lf \n", num3); // long double 출력 : %Lf

    return 0;
}

또한, 실수의 입력과정에서 'e 표기법'도 사용 가능하다.