언어 자료구조 알고리즘/디딤돌 C언어

[디딤돌 C언어] 24. printf 함수

언제나휴일 2016. 1. 1. 11:57
반응형

 [디딤돌 C언어] 24. printf 함수



 

int printf(const char * format, ... );
 
pritnf 함수의 원형(함수를 사용할 때 전달하는 입력 매개 변수 리스트와 반환 형식)을 보면 반환 형식이 int이고 첫 번째 입력 매개 변수는 const char *이고 뒤에 다른 입력 매개 변수가 여러 개 올 수 있어요.
 
printf 함수의 첫 번째 인자에는 어떤 형태로 출력할 것인지 표현하죠.
그리고 두 번째 이후의 인자는 출력할 데이터들이 와요.
그리고 printf 함수를 호출했을 때 반환하는 값은 콘솔 화면에 출력한 문자 개수예요.
 
printf 함수의 반환 값
#include <stdio.h>
int main()
{
    int re = 0;
 
    re = printf("Hello World %d\n",123);
    printf("re: %d \n",re);
    return 0;
}
실행 결과
Hello World 123
re: 16
 
위 예제를 보면 Hello World 123[개행 문자]를 출력한 후에 반환값을 다시 출력하고 있어요.
printf 함수는 출력한 문자의 개수를 반환하는데 공백이나 탭, 개행 문자(엔터)도 하나의 문자로 취급해요.
따라서 실제 출력한 문자 개수는 16개이며 printf 함수의 결과값으로 16을 반환받음을 알 수 있어요.  
 
 printf 함수와 scanf 함수는 첫 번째 인자로 출력 및 입력 받고자 하는 포멧 문자열을 전달합니다.
 
다음은 포멧 문자열을 어떻게 사용하는지 설명한 것이예요.
전체를 기억할 필요는 없여요.
자주 사용하다 보면 자연스럽게 익혀질 거예요.
지만 필요할 때 찾아서 볼 수 있게 표시는 해 두세요.
 
포멧 지정 문자열에 % 문자는 변환 사양 문자로 옵션으로 flags와 길이 수정자가 올 수 있으며 필수적으로 어떠한 형식으로 출력할 것인지 포멧 지정자 문자인 diouxXaAeEfFgG% 중에 하나를 사용합니다.
d,i
int 형식 인자를 10진수로 출력합니다.
o, u, x, X
unsigend int 형식 인자를 8진수(o), 10진수(u), 16진수(x 또는 X)로 출력합니다. x를 사용하면 16진수의 abcdef를 소문자로 출력하고 X를 사용하면 ABCDEF를 출력합니다.
f,F
double 형식 인자를 [-]ddd.ddd 형태로 출력합니다. 디폴트로 소수점 이하 6자리를 출력하며 [d].[d] 형태로 폭과 소수점 이하 출력할 자리수를 결정할 수 있습니다. 이 때 출력하지 않는 자리의 값은 반올림하여 출력합니다.
※ scanf
%f float 형식 포인터 인자, %l" double 형식 포인터 인자일 때 사용하는 것 때문에 많은 개발자는 printf에서도 %lf double 형식 인자일 때 사용해야 하는 것으로 생각하지만 printf에서는 %lf에서 l은 아무런 영향도 미치지 않습니다. (ISO/IEC 9899:TC3 표준 문서 276 페이지~277페이지)
※ printf
에서 %lf %f가 차이가 없지만 scanf 사용하는 것과 혼돈하고 기억할 필요 없이 언제나 %lf를 쓴다고 문제가 발생하지는 않습니다.
e,E
double 형식 인자를 [-]d.ddde±dd 형태로 출력합니다.
g,G
는 알아서 f e(FE) 형태로 출력합니다.
a,A
double 형식 인자를 [-]0xh.hhhhp±dd 형태로 출력합니다.
c
는 문자를 출력합니다. int 형식 인자일 때 unsigned char로 변환 후 문자를 출력합니다.
s
는 종료 문자를 만나기 전까지의 문자의 조합을 출력합니다. 문자열을 출력한다고 생각할 수 있습니다.
p
void 포인터로 메모리 주소를 16진수로 출력합니다.
%
%를 출력합니다. 따라서 %를 출력하려면 %%로 포멧을 지정합니다.
flags
에는 -+공백#O 가 있습니다.
-
는 출력 필드를 왼쪽으로 배치합니다. 디폴트는 오른쪽입니다.
+
는 언제나 부호 필드를 출력합니다.
공백 은 기호가 없을 때 수 앞에 공백을 출력합니다.
#
8진수나 16진수로 출력할 때 수 앞에 o(또는 O) 0x(또는 0X)를 출력합니다.
O
는 소수점 이하 자리가 값이 있는 부분까지만 출력합니다.
길이 수정자는 hh, h, l, ll,j, z, t, L이 있습니다.
hh
diouxX가 뒤에 오면 인자를 char 혹은 unsigned char로 변환하여 출력합니다.
h
diouxX가 뒤에 오면 인자를 short 혹은 unsigned short로 변환하여 출력합니다.
l
은 뒤에 diouxX가 뒤에 오면 인자를 long 혹은 unsigned long으로 변환하여 출력합니다.
ll
은 뒤에 diouxX가 뒤에 오면 long long 혹은 unsigned long long으로 변환하여 출력합니다.
j
는 뒤에 diouxX가 오면 intmax_t 로 변환하여 출력합니다.
z
는 뒤에 diouxX가 오면 size_t 로 변환하여 출력합니다.
t
는 뒤에 diouxX가 오면 ptrdiff_t 로 변환하여 출력합니다.
L
은 뒤에 aAeEfFgG가 오면 long double 로 변환하여 출력합니다.


// 다양한 포멧을 지정하여 출력
#include <stdio.h>
#include <limits.h>
#include <math.h>
int main (void)
{
    printf("================type====================\n");
    printf("1. 십진수로 출력: % -d \n", 123);
    printf("2. 부호있는 십진수로 출력: %i \n", 123);
    printf("3. 부호없는 8진수로 출력: %o \n", 123);
    printf("4. 부호없는 십진수로 출력: %u \n", 123);
    printf("5. 부호없는 16진수로 출력(소문자): %x \n", 123);
    printf("6. 부호없는 16진수로 출력(대문자): %X \n", 123);   
    printf("7. 부동 소수점 표기로 출력: %f \n",123.45);
    printf("8. 지수형 표기로 출력(소문자): %e  \n",123.45);
    printf("9. 지수형 표기로 출력(대문자):  %E \n",123.45);
    printf("10. 간단한 표기로 출력(소문자): %g \n",123.45);
    printf("11. 간단한 표기로 출력(대문자): %G \n",123.45);
    printf("12. 문자 출력: %c \n",'a');
    printf("13. 문자열 출력: %s \n", "Hello");
    printf("14. 퍼센트 문자 출력: %%\n");
    printf("15. 메모리 주소 출력: %p \n","Hello");
    printf("16. long long 형식 출력: %lld\n", 0x123456789012345);   
 
    printf("================flag====================\n");
    printf("1. flag 지정하지 않고 10진수로 출력: %8d \n",123);
    printf("2. flag -를 지정하여 10진수로 출력: %-8d \n", 123);
    printf("3. flag +를 지정하여 10진수로 출력: %+d\n",123);
    printf("4. flag 지정하지 않고 8진수로 출력: %o\n",123);
    printf("5. flag #을 지정하여 8진수로 출력: %#o\n",123);
    printf("6. flag 지정하지 않고 16진수로 출력:%X\n",123);
    printf("7. flag #을 지정하여 16진수로 출력:%#X\n",123);
 
    printf("===========width .prec, modifier ======\n");
    printf("1.flag #을 지정하여 16진수로 출력(대문자): %#X \n",0x123456);
    printf("2.flag #, modifier h를 지정하여 16진수로 출력(대문자): %#hX \n",0x123456);
    printf("3.flag #, width 12 지정하여 16진수로 출력(대문자): %#12X \n",0x123456);
    printf("4.flag #, width 012 지정하여 16진수로 출력(대문자): %#012X \n",0x123456);
    printf("5. .prec .3을 지정하여 부동 소수점 표기로 출력: %.3f \n",123.456789);
   
 
    printf("===========long long 타입 출력 ===========\n");
    printf("lld 사용: %lld\n", 1234567890123);
 
    printf("========pow(10.0,-50)출력======\n");
    printf("Lf 사용:%.50Lf\n", pow(10.0,-50));   
    return 0;
}
 
출력
================type====================
1.
십진수로 출력:  123
2.
부호있는 십진수로 출력: 123
3.
부호없는 8진수로 출력: 173
4.
부호없는 십진수로 출력: 123
5.
부호없는 16진수로 출력(소문자): 7b
6.
부호없는 16진수로 출력(대문자): 7B
7.
부동 소수점 표기로 출력: 123.450000
8.
지수형 표기로 출력(소문자): 1.234500e+02 
9.
지수형 표기로 출력(대문자):  1.234500E+02
10.
간단한 표기로 출력(소문자): 123.45
11.
간단한 표기로 출력(대문자): 123.45
12.
문자 출력: a
13.
문자열 출력: Hello
14.
퍼센트 문자 출력: %
15.
메모리 주소 출력: 01366D4C
16. long long
형식 출력: 81985529205302085
================flag====================
1. flag
지정하지 않고 10진수로 출력:      123
2. flag
-를 지정하여 10진수로 출력: 123     
3. flag
+를 지정하여 10진수로 출력: +123
4. flag
지정하지 않고 8진수로 출력: 173
5. flag
#을 지정하여 8진수로 출력: 0173
6. flag
지정하지 않고 16진수로 출력:7B
7. flag
#을 지정하여 16진수로 출력:0X7B
===========width
.prec, modifier ======
1.flag #
을 지정하여 16진수로 출력(대문자): 0X123456
2.flag #, modifier h
를 지정하여 16진수로 출력(대문자): 0X3456
3.flag #, width 12
지정하여 16진수로 출력(대문자):     0X123456
4.flag #, width 012
지정하여 16진수로 출력(대문자): 0X0000123456
5. .prec
.3을 지정하여 부동 소수점 표기로 출력: 123.457
===========long long
타입 출력 ===========
lld
사용:1234567890123
========pow(10.0,-50)
출력======
Lf
사용:0.00000000000000000000000000000000000000000000000001
 
◈ 기본 연습
1. ‘a’ 문자의 아스키 코드 값을 출력하시오.
2. 10진수 255 16진수로 출력하시오.
3. 185.39485702를 소수점 이하 4자리까지 출력하시오.



관련 게시글

[정답] 디딤돌 C언어 24. printf 함수

[디딤돌 C언어] 23 표준 입출력 개요

[디딤돌 C언어] 25. putchar, puts 함수

[디딤돌 C언어] 26, scanf, scanf_s 함수

[디딤돌 C언어] 27. getchar, gets, gets_s 함수

[디딤돌 C언어] 28. 정리하기


무료 동영상 강의

[C언어 무료 동영상 강의] 24. printf 함수


반응형