출력함수 printf는 내부의 수치 값을 문자로 바꾸어 준다. 이 전의 장들에서는 간단한 방법으로 printf를 사용하였다 여기서 설명된 사항들은 많이 쓰이는 전형적인 사례만을 언급하였다.전반적인 설명은 부록을 참고하자 


int printf(char *format,arg1,arg2,...)


printf는 format이라는 문자열의 제어하에서 표준 풀력 장치에 매개변수를 변환하고 형식화한 다음 출력시키고 풀력된 문자의 개수를 리턴한다. 출력형식 제어 문자열(format)은 두 종류의 대상체를 포함한다. 하나는 출력될 보통 문자이고 또 다른 하나는 출력 형식을 정해 주는 문자인데 매개변수를 지정된 형태로 변환시켜 printf로 출력하게 한다. 변환문자의 앞에는 %를 붙인다.%와 변환문자 사이에는 다음과 같은것이 순서대로 올 수있다.


-변환된 매개변수를 왼쪽에 맞추어 출력하게 하는 마이너스 부호

-최소너비를 지정하는 숫자 변환된 매개변수는 적어도 이 너비로 출력된다 만일 필요하다면 왼쪽 또는 오른쪽의 폭을 맞추기 위해 대른것(공백 또는 0)으로 체워진다.

-유효숫자를 나타내는 마침표(.)

-정밀도를 나타내는 숫자. 이숫자는 문자열을 출력하는 경우 그 최대 길이를 실수 값인 경우는 소수점 이하 숫자 길이를 정수 출력의 경우는 최소 숫자 길이를 나타낸다.

-만일 정수가 short로 출력되어야 하면 h,long으로 출력시키려면 소문자 1을 쓴다


변환문자는 아래 나타냈다 만일 %뒤의 문자가 변환문자가 아닌 경우는 동작이 정의되어 있지 않다.

                   

문자 

 변수형태

출력된 형태 

 d,i

 int

 10진수 

 o

 int

 부호없는 8진수

 x,X

 int

 부호없는 16진수(앞에 0x나 0X가 없는),10,...15에 대해 abcdef나     ABCDEF를 사용한다

 u

 int

 부호없는 10진수

 c

 int

 단일 문자 

 s

 char *

 문자열로 부터 '\0'가 있을때 까지 문자가 출력되거나 정밀도에 의해 주어진 문자수 만큼 문자가 출력된다

 f

 double

 [-]m,dddddd 여기서 d의 수는 정밀도에 의해서 주어진다(기본설정 값은 6이다.)

 e,E

 double

 [-]m,dddddd e+-xx또는,[-]m,ddddddE+-xx,여기서 d의 수는 정밀도에 의해서 주어진다(기본설정 값은 6이다.)

 g,G

 double

 만일 지수가 주어진 정밀도 이상이거나 -4보다 작으면 %e나 %E를 사용하고 그렇지 않으면 %f를 사용한다. 뒤에 붙는 0과 소수점은 출력되지 않는다.

 p

 void *

 포인터(시스템에 따라 표현이 다름)

 %

 변환되지 않는다

 %를 출력


폭(정밀도)은 *로도 표현될수 있는데 그러면 출력형태는 출력될 매개변수에 의해 결정된다 예를 들면 문자열 s로부터 max 문자를 출력한다.

printf("%.*s",max,s);


대부분의 출력형 변환은 앞에서 설명하였지만 여기서 더 자세히 설명하기로 한다.

다음의 표는 "hello,world"(12문자)를 출력 시키는데 있어서의 여러가지 변환 효과를 나타내었다. 각각 필드의 주위에 콜론(;)을 찍어서 그들의 범위를 알 수 있게 하였다.


:%s:           :hello, world:

:%10s:         :hello, world:

:%.10s:        :hello, wor:

:%-10s:        :hello, world:

:%.15s:        :hello, world:

:%-15s:        :hello, world   :

:%15.10s:      :     hello, wor:

:%-15.10s:     :hello, wor     :


printf는 매개변수의 개수와 그들의 형태가 무엇인지를 결정하기 위해 첫번째 매개변수를 이용한다. 만일 매개변수가 충분치 않거나 형(type)이 틀렸을 경우에는 혼란을 일으키게 되어 무의미한 결과를 얻게 된다. 다음의 두 호출 사이의 차이가 뭔지 잘 보기 바란다.


printf(s);         /* FAILS if s contains % */

printf("%s",s);    /* SAFE */


sprintf 함수는 printf가 행하느 같은 변환을 행하지만,출력을 문자열(string)에 저장하는 것이 다른점이다.


int sprintf(char *sting,char *format,arg1.arg2,...)


sprintf는 arg1,arg2등의 매개변수를 printf와 같은 방법으로 형식화 시킨다. 하지만 표준 입출력 대신에 문자열에 결과를 저장한다. 문자열은 결과를 수용할 만큼의 충분한 크기여야 한다.


예제 7-2 임의의 입력을 알아볼 수있는 형태로 출력시키는 프로그램을 작성하라 그래픽 문자가 들어오면 8진수나 16진수로 출력시켜야 하며,긴 행은 적당한 길이로 끊어서 출력해야 한다.