C Language                
            포맷 된 입력 / 출력
        
        
            
    수색…
포인터 값을 개체에 인쇄하기
 함수 포인터 대신 객체에 대한 포인터의 값을 출력하려면 p 변환 지정자를 사용하십시오. 이것은 void -pointer 만 출력하도록 정의되었으므로, void 가 아닌 값을 출력하려면 명시 적으로 void* 로 변환 ( "casted *")해야합니다. 
#include <stdlib.h> /* for EXIT_SUCCESS */
#include <stdio.h>  /* for printf() */
int main(void)
{
  int i;
  int * p = &i;
  printf("The address of i is %p.\n", (void*) p);
  return EXIT_SUCCESS;
}
 <inttypes.h> 및 uintptr_t 
 C99 이상에서 포인터를 인쇄하는 또 다른 방법은 uintptr_t 유형과 <inttypes.h> 의 매크로를 사용하는 것입니다. 
#include <inttypes.h> /* for uintptr_t and PRIXPTR */
#include <stdio.h>    /* for printf() */
int main(void)
{
  int  i;
  int *p = &i;
  printf("The address of i is 0x%" PRIXPTR ".\n", (uintptr_t)p);
  return 0;
}
 이론적으로 정수로 변환 된 포인터를 보유 할 수있는 정수 유형이 없기 때문에 uintptr_t 유형이 존재하지 않을 수 있습니다. 실제로 그것은 존재합니다. 함수에 대한 포인터는 uintptr_t 유형으로 변환 할 필요가 없습니다. 그러나 가장 자주 변환 할 수도 있습니다. 
 uintptr_t 유형이 존재하면 intptr_t 유형도 존재합니다. 주소를 부호있는 정수로 취급하려는 이유가 명확하지 않습니다. 
표준 전 기록 :
 K & R-C 시대 이전의 C89 이전에는 void* (헤더 <stdlib.h> 도 프로토 타입도 없었고 int main(void) 표기도 없었습니다.) 포인터가 long unsigned int 로 캐스팅되었고 lx 길이 수정 자 / 변환 지정자. 
아래의 예는 정보를 제공하기위한 것입니다. 요즘은이 코드가 유효하지 않아 불명확 한 정의되지 않은 동작을 유발할 수 있습니다.
#include <stdio.h> /* optional in pre-standard C - for printf() */
int main()
{
  int  i;
  int *p = &i;
  printf("The address of i is 0x%lx.\n", (long unsigned) p);
  return 0;
}
개체에 대한 두 포인터 값의 차이점 인쇄
 객체에 대한 두 포인터의 값을 빼면 부호있는 정수 * 1이 됩니다. 따라서 적어도 d 변환 지정자를 사용하여 인쇄됩니다. 
 C99 <stddef.h> 는 ptrdiff_t 유형을 정의하기 때문에 이러한 "포인터 차이"를 수용 할만큼 충분히 넓은 유형인지 확인합니다. ptrdiff_t 를 인쇄하려면 t 길이 수정자를 사용하십시오. 
#include <stdlib.h> /* for EXIT_SUCCESS */
#include <stdio.h> /* for printf() */
#include <stddef.h> /* for ptrdiff_t */
int main(void)
{
  int a[2];
  int * p1 = &a[0], * p2 = &a[1];
  ptrdiff_t pd = p2 - p1;
  printf("p1 = %p\n", (void*) p1);
  printf("p2 = %p\n", (void*) p2);
  printf("p2 - p1 = %td\n", pd);
  return EXIT_SUCCESS;
}
결과는 다음과 같습니다.
p1 = 0x7fff6679f430
p2 = 0x7fff6679f434
p2 - p1 = 1
 차이의 결과 값은 포인터를 빼는 점의 유형 크기 ( int 됩니다. 이 예제의 int 크기는 4입니다. 
* 1 빼는 두 포인터가 같은 객체를 가리 키지 않으면 그 동작은 정의되지 않습니다.
인쇄용 변환 지정자
| 변환 지정자 | 인수의 유형 | 기술 | 
|---|---|---|
| i,d | int | 십진수를 인쇄하다 | 
| u | 부호없는 정수 | 십진수를 인쇄하다 | 
| o | 부호없는 정수 | 8 진수를 출력한다. | 
| x | 부호없는 정수 | 16 진수, 소문자를 인쇄합니다. | 
| X | 부호없는 정수 | 16 진수, 대문자로 인쇄합니다. | 
| f | 더블 | 정밀도를 지정하지 않으면 float를 기본 정밀도 6으로 인쇄합니다 (특수 숫자 nan및inf또는infinity에는 소문자가 사용됩니다) | 
| F | 더블 | 정밀도를 지정하지 않으면 float를 기본 정밀도 6으로 인쇄합니다 (대문자 NAN및INF또는INFINITY대문자 사용). | 
| e | 더블 | 가수 / 지수를 사용하는 과학 표기법을 사용하여 정밀도가 제공되지 않으면 float를 기본 정밀도 6으로 인쇄합니다. 소문자 지수 및 특수 숫자 | 
| E | 더블 | 가수 / 지수를 사용하는 과학 표기법을 사용하여 정밀도가 제공되지 않으면 float를 기본 정밀도 6으로 인쇄합니다. 대문자 지수 및 특수 숫자 | 
| g | 더블 | f또는e사용합니다 [아래 참조] | 
| G | 더블 | F또는E중 하나를 사용합니다 [아래 참조] | 
| a | 더블 | 16 진수, 소문자를 인쇄합니다. | 
| A | 더블 | 16 진수, 대문자로 인쇄합니다. | 
| c | 숯 | 단일 문자를 인쇄합니다. | 
| s | 숯* | NUL종결 자까지 문자열을 출력하거나, 지정된 경우 정밀도로 주어진 길이로 잘립니다. | 
| p | 빈* | void-pointer 값을 출력한다; 비void-pointer는 명시 적으로void*로 변환 ( "캐스트")해야합니다. 객체 포인터 만, 함수 포인터는 아니다 . | 
| % | 해당 없음 | %문자를 인쇄합니다. | 
| n | int * | 지금까지에 인쇄 된 바이트 수를 쓰기 int향하고있다. | 
 ISO / IEC 9899 : 2011 §7.21.6.1 ¶7에 따라 길이 변경자는 %n 적용될 수 있습니다 (예 : %hhn 은 다음 n 변환 지정자가 signed char 인수에 대한 포인터에 적용됨을 나타냄). 
 부동 소수점 변환은 기본 승격 규칙 때문에 float 및 double 유형에 적용됩니다. §6.5.2.2 함수 호출, ¶7 함수 프로토 타입 선언자의 줄임표 표기법을 사용하면 마지막으로 선언 된 매개 변수 다음에 인수 유형 변환이 중지됩니다. 기본 인수 승격은 후행 인수에서 수행됩니다. ) 따라서 printf() 와 같은 printf() 는 참조 된 변수가 float 유형 인 경우에도 double 값만 전달됩니다. 
 g 및 G 형식을 사용하면 e 및 f (또는 E 및 F ) 표기법 중 선택은 C 표준 및 printf() 에 대한 POSIX 사양에 설명되어 있습니다. 
부동 소수점 수를 나타내는 double 인수는 변환 된 값과 정밀도에 따라 스타일
f또는e(또는G변환 지정자의 경우 스타일F또는E)로 변환되어야합니다. 0이 아닌 경우P는 정밀도와 같고, 정밀도가 생략되면 6, 정밀도가 0이면 1입니다. 그런 다음 스타일E하는 변환의 지수가X:
- P> X> = -4 인 경우, 변환은 스타일
f(또는F) 및 정밀도P - (X+1)됩니다.- 그렇지 않으면, 변환은 스타일
e(또는E)와 정밀도P - 1이루어져야한다.
마지막으로, '#'플래그가 사용되지 않는 한, 끝에 오는 0은 결과의 분수 부분에서 제거되어야하고 소수 부분이 남아 있지 않으면 소수점 문자는 제거되어야합니다.
printf () 함수
 <stdio.h> 포함을 통해 액세스되는 printf() 함수는 C의 콘솔에 텍스트를 인쇄하는 데 사용되는 기본 도구입니다. 
printf("Hello world!");
// Hello world!
일반 포맷되지 않은 문자 배열은 괄호 사이에 직접 배치하여 직접 인쇄 할 수 있습니다.
printf("%d is the answer to life, the universe, and everything.", 42);
// 42 is the answer to life, the universe, and everything.
int x = 3;
char y = 'Z';
char* z = "Example";
printf("Int: %d, Char: %c, String: %s", x, y, z);
// Int: 3, Char: Z, String: Example
 다른 방법으로, 정수, 부동 소수점 숫자, 문자 등은 이스케이프 문자 % 사용하여 인쇄 할 수 있으며 문자 다음에 형식 지정자 로 알려진 형식을 나타내는 문자 시퀀스가 뒤 따릅니다. 
 printf() 함수에 대한 모든 추가 인수는 쉼표로 구분되며 이러한 인수는 형식 지정자와 동일한 순서 여야합니다. 잘못 입력 된 인수 나 인수가 부족하면 오류 또는 정의되지 않은 동작이 발생하지만 추가 인수는 무시됩니다. 각 인수는 리터럴 값이나 변수가 될 수 있습니다. 
 성공한 실행 후, 인쇄 된 문자의 수는 int 유형으로 리턴됩니다. 그렇지 않으면, 실패는 음수 값을 리턴합니다. 
길이 수정 자
 C99 및 C11 표준은 printf() 대해 다음 길이 수정자를 지정합니다. 그 의미는 다음과 같습니다. 
| 모디파이어 | 수정하다 | 적용 대상 | 
|---|---|---|
| hh | d, i, o, u, x 또는 X | char,signed char또는unsigned char | 
| h | d, i, o, u, x 또는 X | short int또는unsigned short int | 
| 엘 | d, i, o, u, x 또는 X | long int또는unsigned long int | 
| 엘 | a, A, e, E, f, F, g 또는 G | double(scanf()와의 호환성을 위해, C90에서는 정의되지 않음) | 
| 어울리다 | d, i, o, u, x 또는 X | long long int또는unsigned long long int | 
| j | d, i, o, u, x 또는 X | intmax_t또는uintmax_t | 
| 지 | d, i, o, u, x 또는 X | size_t또는 해당 서명 된 유형 (POSIX의ssize_t) | 
| 티 | d, i, o, u, x 또는 X | ptrdiff_t또는 대응하는 부호없는 정수 유형 | 
| 엘 | a, A, e, E, f, F, g 또는 G | long double | 
길이 수정자가 위에 지정된 것과 다른 변환 지정자와 함께 표시되면 동작은 정의되지 않습니다.
 Microsoft는 다른 길이 수정자를 지정하고 명시 적으로 hh , j , z 또는 t 지원하지 않습니다. 
| 모디파이어 | 수정하다 | 적용 대상 | 
|---|---|---|
| I32 | d, i, o, x 또는 X | __int32 | 
| I32 | o, u, x 또는 X | unsigned __int32 | 
| I64 | d, i, o, x 또는 X | __int64 | 
| I64 | o, u, x 또는 X | unsigned __int64 | 
| 나는 | d, i, o, x 또는 X | ptrdiff_t(32 비트 플랫폼에서는__int32, 64 비트 플랫폼에서는__int64) | 
| 나는 | o, u, x 또는 X | size_t(32 비트 플랫폼에서는unsigned __int64unsigned __int32, 64 비트 플랫폼에서는unsigned __int64) | 
| L 또는 L | a, A, e, E, f, g 또는 G | long double(Visual C ++에서long double은 고유 한 형식이지만long double과 동일한 내부 표현double집니다.) | 
| l 또는 w | C 또는 C | printf및wprintf기능을 갖춘 넓은 문자. (lc,lC,wc또는wC형식 지정자는printf함수에서C와wprintf함수에서c와 동의어입니다.) | 
| l 또는 w | s, S 또는 Z | printf및wprintf기능이있는 넓은 문자열입니다. (ls,lS,ws또는wS유형 지정자는printf함수에서S와wprintf함수에서s와 동의어입니다.) | 
 C , S 및 Z 변환 지정자와 I , I32 , I64 및 w 길이 수정자는 Microsoft 확장입니다. 치료 l 위한 수정 같은 long double 이 아니라 double 당신이하지 않는 한 차이를 발견하기 위해 하드 누르면됩니다 불구하고, 표준과 다른 long double 과는 다른 표현이 double . 
형식 플래그 인쇄
 C 표준 (C11 및 C99도)은 printf() 대해 다음과 같은 플래그를 정의합니다. 
| 깃발 | 전환 수 | 의미 | 
|---|---|---|
| - | 모든 | 변환 결과는 필드 내에서 왼쪽 맞춤이됩니다. 이 플래그가 지정되지 않으면 변환이 오른쪽 정렬됩니다. | 
| + | 부호가있는 숫자 | 부호 변환의 결과는 항상 부호 ( '+'또는 '-')로 시작됩니다. 이 플래그가 지정되지 않으면 음수 값이 변환 될 때만 변환이 부호로 시작됩니다. | 
| <space> | 부호가있는 숫자 | 서명 된 변환의 첫 번째 문자가 부호가 아니거나 부호가있는 변환 결과 문자가없는 경우 결과에 <space>가 접두사로 사용됩니다. 즉,<space>및 '+'플래그가 모두 표시되면<space>플래그는 무시됩니다. | 
| # | 모든 | 값을 대체 양식으로 변환하도록 지정합니다. o변환의 경우, 필요한 경우에만 결과의 첫 번째 숫자가 0이되도록 정밀도를 높입니다 (값과 정밀도가 모두 0이면 하나의 0이 인쇄됩니다).x또는X변환 지정자의 경우, 0이 아닌 결과의 앞에는0x(또는0X)가 붙습니다. 들면 , ,aAe,E,f,F,g및G변환 지정자, 결과는 항상 어떤 숫자가 기수 문자를 수행하지 않는 경우에도, 기수 문자를 포함한다. 이 플래그가 없으면 숫자가 뒤따라야 만 이러한 변환 결과에 기수 문자가 나타납니다.g및G변환 지정자의 경우 후미에있는 0은 정상적으로 결과에서 제거되지 않습니다. 다른 변환 지정자의 경우 동작은 정의되지 않습니다. | 
| 0 | 숫자의 | d, i, o, u, x, X, a, A, e, E, f, F, g 및 G 변환 지정자의 경우 앞에 오는 0 (부호 또는 기준 표시 이후) 무한대 또는 NaN을 변환 할 때를 제외하고는 스페이스 패딩을 수행하는 대신 폭을 사용합니다. '0'및 '-'플래그가 모두 표시되면 '0'플래그가 무시됩니다. d, i, o, u, x 및 X 변환 지정자의 경우, 정밀도가 지정되면 '0'플래그는 무시됩니다. ''0 '및 <apostrophe>플래그가 모두 표시되면 그룹화 문자가 제로 패딩 전에 삽입됩니다. 다른 전환의 경우 동작이 정의되지 않습니다. ⌫ | 
이 플래그는 Microsoft 에서도 동일한 의미로 지원됩니다.
 printf() 대한 POSIX 사양은 다음을 추가합니다. 
| 깃발 | 전환 수 | 의미 | 
|---|---|---|
| ' | i, d, u, f, F, g, G | 10 진수 변환 결과의 정수 부분은 수천 개의 그룹화 문자로 형식화되어야합니다. 다른 변환의 경우 동작이 정의되지 않습니다. 비 화폐 그룹화 문자가 사용됩니다. |