# printf, scanf

# printf 함수 이야기

## 특수문자의 출력이 필요한 이유

* 문자열에 포함이 되는 특수문자는 작은 따옴표로 묶어서 독립된 문자상수로도 존재할 수 있다.
    

`⁠char ch='\n';`⁠

* 큰 따옴표는 문자열의 시작과 끝으로 해석이 되니, 큰 따옴표 자체의 출력을 원하는 경우에는 큰 따옴표 앞에 \\ 문자를 붙이기로 함
    

`⁠printf("앞집 강아지가 말했다. \"멍~! 멍~!\" 정말 귀엽다.");`⁠

## printf 함수의 서식지정

* `printf`의 `f`는 formatted(서식이 지정된)을 의미 즉, 서식이 지정된 형태의 출력
    
* 출력양식이 만들어진 상태에서 출력을 진행한다
    

“제 나이는 10진수로 12살, 16진수로 C살입니다.”

`⁠"제 나이는 10진수로 %d살, 16진수로 %X살입니다."  // 대문자 X면 알파벳 대문자, 소문자 x면 알파벳 소문자`⁠

### 서식 문자의 종류와 그 의미

* `%d` = `char`, `short`, `int`
    
* `%ld` = `long`
    
* `%lld` = `long long`
    
* `%u` = `unsigned int`(부호 없는 10진수 정수)
    
* `%o` = `unsigned int` (부호 없는 8진수 정수) 8진수를 8진수답게 출력하려면 `%#o`
    
* `%x`, `%X` = `unsigned int`(부호 없는 16진수 정수) 16진수를 16진수답게 출력하려면 `%#x`
    
* `%f` = `float`, `double`
    
* `%Lf`\= `long double`
    
* `%e`, `%E` = `float`, `double`(e 또는 E 방식의 부동소수점 실수)
    
* `%g`, `%G` = `float`, `double`(값에 따라 %f와 %e 사이에서 선택)
    
* `%c` = `char`, `short`, `int`(값에 대응하는 문자)
    
* `%s` = `char *`(문자열)
    
* `%p` = `void *`(포인터의 주소 값)
    

### 필드 폭을 지정하여 정돈된 출력 보이기

* 출력의 형태는 기본적으로 오른쪽 정렬이다!
    
* `%8d` = 필드 폭을 8칸 확보하고, 오른쪽 정렬해서 출력을 진행한다.
    
* `%-8d` = 필드 폭을 8칸 확보하고, 왼쪽 정렬해서 출력을 진행한다.
    

```c
#include <stdio.h>

int main(void)
{
    printf("%-8s %14s %8s \n", "이  름", "전공학과", "학년");
    printf("%-8s %14s %5d \n", "김동수", "전자공학", 3);
    printf("%-8s %14s %5d \n", "이을수", "캄퓨터공학", 2);
    printf("%-8s %14s %5d \n", "한선영", "미술교육학", 4);
    return 0;
}
```

```c
// 결과
이  름   전공학과   학년 
김동수   전자공학     3 
이을수 캄퓨터공학     2 
한선영 미술교육학     4 
```

# scanf 함수

## 정수 기반의 입력형태 정의

* `scanf` 함수는 `printf` 함수의 상대적인 기능
    
    * 어떻게 받아들일 거니?
        
    * 어디에 저장할까?
        
* `%d` = 10진수 정수의 형태로 데이터를 입력 받는다.
    
* `%o` = 8진수 양의 정수의 형태로 데이터를 입력 받는다.
    
* `%x` = 16진수 양의 정수의 형태로 데이터를 입력 받는다.
    

```c
#include <stdio.h>

int main(void)
{
    int num1, num2, num3;
    printf("세 개의 정수 입력: ");
    scanf("%d %o %x", &num1, &num2, &num3);

    printf("입력된 정수 10진수 출력: ");
    printf("%d %d %d \n", num1, num2, num3);
    return 0;
}

// 결과
세 개의 정수 입력: 12 12 12 // 똑같은 정수 12를 입력해도, 실제 저장되는 값에는 차이가 있다.
입력된 정수 10진수 출력: 12 10 18
```

## 실수 기반의 입력형태 정의

* `printf`에서는 `%f`, `%e`, `%g`의 의미가 각각 달랐지만, `scanf` 함수에서는 ‘`float`형 데이터를 입력 받겠다' 라는 동일한 의미를 담고 있다.
    
* `%lf` = `double`
    
* `%Lf` = `long double`
    

```c
#include <stdio.h>

int main(void)
{
    float num1;
    double num2;
    long double num3;

    printf("실수 입력1(e 표기법으로): ");
    scanf("%f", &num1);
    printf("입력된 실수 %f \n", num1);

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

    printf("실수 입력3(e 표기법으로): ");
    scanf("%Lf", &num3);
    printf("입력된 실수 %Lf \n", num3);
    return 0;
}

// 결과
실수 입력1(e 표기법으로): 1.1e-3
입력된 실수 0.001100 
실수 입력2(e 표기법으로): 0.1e+2
입력된 실수 10.000000 
실수 입력3(e 표기법으로): 0.17e-4
입력된 실수 0.000017
```

* 위 결과를 바탕으로 알 수 있는 점
    
    * 실수의 입력과정에서 e 표기법을 사용해도 된다.
        
    * `float`, `double`, `long double`의 데이터 출력에 사용되는 서식문자는 각각 `%f`, `%f`, `%Lf`이다.
        
    * `float`, `double`, `long double`의 데이터 입력에 사용되는 서식문자는 각각 `%f`, `%lf`, `%Lf`이다.
        
* 서식문자 `%s`가 문자열의 입력에 사용된다.
