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 __int64 unsigned __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 )가 붙습니다. 들면 , , a A e , 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 진수 변환 결과의 정수 부분은 수천 개의 그룹화 문자로 형식화되어야합니다. 다른 변환의 경우 동작이 정의되지 않습니다. 비 화폐 그룹화 문자가 사용됩니다. |