답변:
다음과 같이 이중 '%'를 게시하면 이스케이프 처리 할 수 있습니다. %%
귀하의 예를 사용하여 :
printf("hello%%");
'%'기호를 이스케이프 처리하는 것은 printf에만 해당됩니다. 당신이 할 경우 :
char a[5];
strcpy(a, "%%");
printf("This is a's value: %s\n", a);
인쇄됩니다 : This is a's value: %%
%
은 printf
맞습니까?
\045
일부인 컴파일 타임 이스케이프이며 컴파일 할 때 바뀝니다 . 그렇지 C 소스 코드와 함께, 귀하의 문자열의 바이트 다루고, 그리고 그것은의 일부입니다 자신의 이스케이프 시퀀스가 있도록 런타임 기능입니다 기능을 . 즉, "언어 내부의 언어"이며와 같은 결과를 제공합니다 . %
printf
printf
printf("This is a's value: %s\n", a);
printf("This is a's value: \045\0163\012", a);
printf("hello%c", '%');
.. 그러나 %%
다른 인수를 사용하지 않기 때문에 더 좋습니다.
다른 사람들이 말했듯이 %%는 %를 이스케이프합니다.
그러나이 작업을 수행해서는 안됩니다.
char c[100];
char *c2;
...
printf(c); /* OR */
printf(c2);
문자열을 인쇄해야 할 때마다 항상 항상
printf("%s", c)
내장 %가 문제를 일으키는 것을 방지하기 위해 [메모리 위반, segfault 등]
문자열에 형식이 없으면 puts
(또는 fputs
)을 사용할 수 있습니다 .
puts("hello%");
문자열에 형식이있는 경우 :
printf("%.2f%%", 53.2);
주석에서 언급했듯이 puts
a \n
를 출력에 추가 하고 fputs
그렇지 않습니다.
puts
. 나는 puts
문자열 인쇄를 생각하지 않았고 바로 갔다 printf
. 더 이상은 아닙니다.
Nitpick : (및 ) 함수 패밀리의 형식을 지정하는 문자열에서
실제로 이스케이프하지 않습니다 .%
printf()
scanf()
는 %
의에 printf()
(및 scanf()
기능) 가족, 변환 사양을 시작합니다. 변환 스펙의 규칙 중 하나는 변환 스펙 을 시작한 %
직후 ( %
변환 스펙을 시작한 직후 ) '%'
문자가 인수 변환없이 작성되도록합니다.
문자열 에는 실제로 2 개의 '%'
문자가 있습니다 (이스케이프 문자와 달리 : "a\bc"
null이 아닌 문자가 3 인 문자열이고 null이 아닌 문자 "a%%b"
가 4 인 문자열).
C의 백 슬래시는 문자열의 문자를 이스케이프하는 데 사용됩니다. 문자열은 %를 특수 문자로 인식하지 않으므로 이스케이프가 필요하지 않습니다. Printf는 또 다른 문제입니다. %%를 사용하여 하나의 %를 인쇄하십시오.
%%
인쇄시 사용해야하는 잘못된 형식 지정자를 사용 하고 있습니다 %
. 코드는 다음과 같아야합니다.
printf("hello%%");
C에서 사용되는 모든 형식 지정자를 읽으십시오 .
간단히 %
두 번 사용할 수 있습니다."%%"
예:
printf("You gave me 12.3 %% of profit");