관리 메뉴

Kim's Programming

C언어 - 출력함수인 printf를 써보자 본문

Programming/C

C언어 - 출력함수인 printf를 써보자

Programmer. 2015. 7. 11. 18:36

C언어를 배울때 처음 배우는게 입 출력 함수 2개입니다. printf와 scanf가 대표적인 입출력 함수입니다. 오늘 포스팅에서는 printf에 대해서 배워보도록 하겠습니다. 우선 printf는 stdio헤더에 속해있는 함수입니다. 또 변수, 함수값등을 출력 할 수 있으며 정수, 부동소수점등 여러가지 형태의 변수도 출력을 할 수 있습니다. 하지만 printf에는 포맷 스트링의 종류부터 먼져 알아보겠습니다. 포맷 스트링이란, printf 함수를 쓰면서 "이 변수는 이 위치에 이런 형태로 쓸거야"라고 미리 말해주는 역할을 하는 것입니다.

  

 포맷 스트링

 대응 변수

 출력 

 %d

 char(정수일때), short, int

 부호를 포함한 10진수

 %u

 unsigned int

 부호없는 10진수

 %o

 unsigned int

 부호없는 8진수

 %x,%X

 unsigned int

 부호없는 16진수(포맷 스트링의 대문자 소문자에따라 A이상의 값 대소문자 결정)

 %f

 float, double

 10진수 방식의 부동 소수점 실수

 %e

 float, double

 부동 소수점 실수(지수형태 표기, 대소문자에 따라 E의 대소문자 결정)

 %g,G

 float, double

 값에 따라서 %f를 쓰거나 %e 를 선택(역시나 대소문자에 따라서 대소문자 결정)

 %c

 char(문자일때)

 문자 출력

 %s

 char*

 문자열(문자 집합)

 %p

 void*

 포인터 주소값

printf에서 쓰는 포맷 스트링 전부를 써보았습니다. 음... 포맷스트링도 알아봤고 그에 따른 대응 변수도 알아 보았습니다. 다음으론 printf함수를 사용하는 방법을 알아보겠습니다.

 

1
2
3
4
5
6
printf(" 내용 입력");
 
printf("포맷스트링",포맷스트링 대응 변수);
 
printf(" 포맷스트링 내용입력 ",포맷스트링 대응변수);
 
cs

printf는 다음과 같은 형태로 이용을 할 수 있습니다. printf 함수는 포맷스트링과 내용입력을 같이 두어도 알아서 내용 사이에있는 포맷 스트링을 읽어내어 포맷 스트링 위치에 변수를 끼워넣어서 출력을 해줍니다. 하지만 음.. 살펴보다 이런 생각은 안드셨나요? printf안에 변수를 제외한 내용들은 ""안에 써야하는데(printf함수 안에 내용 입력을 위한 "은 출력시에는 "는 출력되지 않습니다. 조금 뒤에 나오는 예시 결과에서 확인해보세.) 음.. 난 출력에도 "를 출력시켜 보고 싶은데 그냥 적으면 중간에 "를 찍은데 까지만 내용으로 인식할텐데.. 라는 생각이요. 아니면 자신은 %를 표시해야하는데 포맷스트링 때문에 겹쳐서 표기가 안될 수도 있겠다라고 생각하는 것은요? 이를 해결하기 위해 printf함수 내용부에 들어가는 특수문자들이 존재합니다.

 

 특수문자

 의미

 비고

 \a

 경고음

 

 \b

 백스페이스

 

 \f

 폼 피드

 

 \n

 개 행 (엔터 효과)

 

 \r

 캐리지 리턴

 

 \t

 수평 탭

 

 \v

 수직 탭

 

 \'

 작은 따옴표 출력

 

 \"

 큰 따옴표 출력

 

 \?

 물음표 출력

 

 \\

 \출력 (또는 역슬래쉬 출력)

 

이럼 이제 이용하는 특수문자들과 포맷 스트링들을 알아 보았으니 포맷 스트링들의 사용 예시를 알아 보겠습니다.

 

1. %d 정수형 출력

 

1
2
3
4
5
6
7
8
9
10
11
12
#include<stdio.h>
 
int main()
{
    int num_1 = 3;
    short num_2 = 123;
    char num_3 = 10;
 
    printf("num_1의 값은 %d\n", num_1);
    printf("num_2의 값은 %d\n", num_2);
    printf("num_3의 값은 %d\n", num_3);
}
cs

일반적으로 정수형을 받는 %d형 소스입니다. %d의 포맷 스트링은 int 형, short형, char형을 받을 수 있는 것을 볼 수 있습니다.

 

 

2. %u 부호없는 정수형 출력

1
2
3
4
5
6
7
8
#include<stdio.h>
 
int main()
{
    unsigned int num_1= 3222;
    printf("num_1의 값은 %u\n", num_1);
 
}

 

부호 없는 정수형을 받습니다. 일반적으로는  unsigned int를 사용하여 변수를 선언하였지만, 부호가 없는 값을 가진 int, short, char의 변수도 출력도 가능합니다.

 

 

3. %o 부호없는 8진수 출력

1
2
3
4
5
6
7
8
#include<stdio.h>
 
int main()
{
    unsigned int num_1= 999;
    printf("num_1의 값은 %o\n", num_1);
 
}
cs

10진수형을 받아서 8진수형으로 변경시켜줍니다. 역시나 위와 같이 부호가 없는 값을 가진 변수도 가능합니다.

 

 

4.%x, %X 부호없는 16진수 출력

1
2
3
4
5
6
7
8
9
#include<stdio.h>
 
int main()
{
    unsigned num_1= 999;
    printf("num_1의 값은(x가 소문자) %x\n", num_1);
    printf("num_1의 값은(x가 대문자) %X\n", num_1);
 
}
cs

x가 소문자냐 대문자냐에 따라서 A이상의 숫자들의 대 소문자를 정하게 됩니다. 이 역시 부호가 없는 값을 가진 변수도 가능합니다.

 

 

5. %f 10진수 부동소수점 출력

1
2
3
4
5
6
7
8
9
10
#include<stdio.h>
 
int main()
{
    float num_1 = 88.5123;
    double num_2 = 451.2653417;
    printf("num_1의 값은 %f\n", num_1);
    printf("num_2의 값은 %f\n", num_2);
 
}
cs

 

 

 

6. %e, %E 지수형 표시

1
2
3
4
5
6
7
8
9
10
#include<stdio.h>
 
int main()
{
    float num_1 = 88.5123;
    double num_2 = 451.2653417;
    printf("num_1의 값은 (e가 소문자) %e\n", num_1);
    printf("num_2의 값은 (e가 대문자) %E\n", num_2);
 
}
cs

 

 

지수형으로 표기하는 %e는 e의 표기방식을 대문자로 또는 소문자로 표기 할 수 있습니다.

 

 

7. %g, %G %e의 형태거나 %f의 형태중 적절한 것을 선택하여 표기

1
2
3
4
5
6
7
8
9
10
11
#include<stdio.h>
 
int main()
{
    float num_1 = 88.5123;
    double num_2 = 451.2653417;
    double num_3 = 15498498165.654419849849649;
    printf("num_1의 값은 (g가 소문자) %g\n", num_1);
    printf("num_2의 값은 (g가 대문자) %G\n", num_2);
    printf("num_2의 값은 (g가 대문자) %G\n", num_3);
}
cs

자리 수가 너무 큰 경우는 %e를 사용하여 출력을 하고 별로 크지 않은 num_1과 num_2는 float형태로 잘라서 표기하였음을 볼 수 있습니다.

 

 

 

 8. %c 문자형 출력 

1
2
3
4
5
6
7
#include<stdio.h>
 
int main()
{
    char character = 'C';
    printf("character의 값은  %c\n", character);
}
cs

문자 한개만 표기가 가능합니다. 만약 한글자 보다 긴 경우라면 제일 위에 있는 글자만 표기가 됩니다.

 

 

9. %s 문자열 출력

1
2
3
4
5
6
7
8
#include<stdio.h>
 
int main()
{
    
    char *character = "char";
    printf("character의 값은  %s\n", character);
}
cs

  

%s와 %c의 차이는 한글자만 표현하냐 2글자 이상을 표현하냐의 차이입니다. %s를 문자열 즉, 문자 집합을 표시할 수 있습니다.

 

 

10. %p 포인터 출력(메모리 주소값 출력)

1
2
3
4
5
6
7
8
9
10
11
#include<stdio.h>
 
int main()
{
    int ppointer = 10;
    int* pointer = &ppointer;
    
    printf("ppointer의 값 %p\n", ppointer);
 
}
cs

 

&p형은 특정변수의 포인터 주소값을 표현하는 함수 입니다. ppointer에 값을 넣고 그 값을 포인터로 선언된 point에 넣은후 값을 출력하였습니다. pointer가 현재 차지하고 있는 주소를 표시하게됩니다.

특수문자의 경우도 포맷 스트링과 같이 큰 따옴표 사이에 작성해주시면 그 위치에서 각 기능을 합니다. 특수문자의 경우는 거의 대부분 \n 정도만 사용을 하는데 다른 것도 많이 있고 이렇게 사용이 가능하다는 것을 알았으면 해서 같이 작성을 해보았습니다.