C의 printf에서 % (퍼센트) 기호를 이스케이프 처리하는 방법은 무엇입니까?


274

printfC에서 사용할 때 % 부호를 어떻게 피 합니까?

printf("hello\%"); /* not like this */

답변:


421

다음과 같이 이중 '%'를 게시하면 이스케이프 처리 할 수 ​​있습니다. %%

귀하의 예를 사용하여 :

printf("hello%%");

'%'기호를 이스케이프 처리하는 것은 printf에만 해당됩니다. 당신이 할 경우 :

char a[5];
strcpy(a, "%%");
printf("This is a's value: %s\n", a);

인쇄됩니다 : This is a's value: %%


8
"printf ("hello %% ");" 맞습니다. 그러나 그것은 내가 생각하는 탈출구가 아닙니다. printf ( "hello \ 045")를 사용하십시오;
Lai Jiangshan

1
@Pablo Santa Cruz : "탈출"하는이 방법 %printf맞습니까?
Lazer

10
이것은 이스케이프 시스템에서 매우 일반적인 규칙의 특별한 경우입니다. 문자 이스케이프 기호를 얻으려면 <escape symbol> <escape symbol>을 사용하십시오.
dmckee --- 전 운영자 고양이 새끼 고양이

12
라이 Jiangshan,이 작동하지 않습니다. 언어의\045 일부인 컴파일 타임 이스케이프이며 컴파일 할 때 바뀝니다 . 그렇지 C 소스 코드와 함께, 귀하의 문자열의 바이트 다루고, 그리고 그것은의 일부입니다 자신의 이스케이프 시퀀스가 있도록 런타임 기능입니다 기능을 . 즉, "언어 내부의 언어"이며와 같은 결과를 제공합니다 . %printfprintfprintf("This is a's value: %s\n", a);printf("This is a's value: \045\0163\012", a);
Triang3l

5
또한 다음을 수행 할 수 있습니다 printf("hello%c", '%');.. 그러나 %%다른 인수를 사용하지 않기 때문에 더 좋습니다.
Triang3l

36

다른 사람들이 말했듯이 %%는 %를 이스케이프합니다.

그러나이 작업을 수행해서는 안됩니다.

char c[100];
char *c2;
...
printf(c); /* OR */
printf(c2);

문자열을 인쇄해야 할 때마다 항상 항상

printf("%s", c)

내장 %가 문제를 일으키는 것을 방지하기 위해 [메모리 위반, segfault 등]


경고는 일반적으로 적절하지만 제공 한 문자열이 형식 문자열로 해석된다는 것을 알고있는 한 "this"를 수행하려는 상황이있을 수 있습니다.
PP.

2
대체 솔루션을 한 번 생각해 냈습니다-버퍼를 다른 버퍼에 복사 한 다음 % 기호를 두 배로 늘립니다. 결국이 아이디어를 접하고 20-30 개의 라인 함수를 한 라인으로 교체했습니다. 걱정하지 마라. 내가 마땅한 것처럼 머리에 대해 나 자신을 때렸다.
Graeme Perrow

사실, 형식 문자열을 얻을 때 99 %의 시간이 인수를 va_list로 가져 오므로 vprintf를 사용해야한다는 것을 잊지 마십시오. 따라서 기술적으로 정확합니다.)
Mikeage

2
puts (c)를 수행하는 것이 훨씬 쉽습니다. 만약
William Pursell 님이

1
puts는 개행을 추가합니다. 그것은 종종 원치 않는 행동입니다.
Mikeage

33

문자열에 형식이 없으면 puts(또는 fputs)을 사용할 수 있습니다 .

puts("hello%");

문자열에 형식이있는 경우 :

printf("%.2f%%", 53.2);

주석에서 언급했듯이 putsa \n를 출력에 추가 하고 fputs그렇지 않습니다.


4
fprintf ()와 직접 왕복하므로 fputs ()도 언급 할 가치가 있습니다.
Tim Post

1
puts는 개행을 추가합니다 [이미 줄이 있더라도]. 당신이 그것을 원한다면, 좋습니다. 그렇지 않으면 ...
Mikeage

@Sinan Ünür :에 대해 알려 주셔서 감사합니다 puts. 나는 puts문자열 인쇄를 생각하지 않았고 바로 갔다 printf. 더 이상은 아닙니다.
Lazer


7

Nitpick : (및 ) 함수 패밀리의 형식을 지정하는 문자열에서
실제로 이스케이프하지 않습니다 .%printf()scanf()

%의에 printf()(및 scanf()기능) 가족, 변환 사양을 시작합니다. 변환 스펙의 규칙 중 하나는 변환 스펙 을 시작한 %직후 ( %변환 스펙을 시작한 직후 ) '%'문자가 인수 변환없이 작성되도록합니다.

문자열 에는 실제로 2 개의 '%'문자가 있습니다 (이스케이프 문자와 달리 : "a\bc"null이 아닌 문자가 3 인 문자열이고 null이 아닌 문자 "a%%b"가 4 인 문자열).


2
기술적으로는 여전히 "탈출"입니다. 특별한 캐릭터는 그들의 특별한 의미를 "탈출"하고 "캐릭터의 본성"으로 돌아가는 방법이 필요합니다
ShinTakezou


4

이처럼 :

printf("hello%%");
//-----------^^ inside printf, use two percent signs together

3

C의 백 슬래시는 문자열의 문자를 이스케이프하는 데 사용됩니다. 문자열은 %를 특수 문자로 인식하지 않으므로 이스케이프가 필요하지 않습니다. Printf는 또 다른 문제입니다. %%를 사용하여 하나의 %를 인쇄하십시오.


3

당신이 사용할 수있는 %%:

printf("100%%");

결과는 다음과 같습니다.

100 %




2

간단히 %두 번 사용할 수 있습니다."%%"

예:

printf("You gave me 12.3 %% of profit");

1

이중 '%'는 ".Format (…)에서도 작동합니다. 예 (iDrawApertureMask == 87, fCornerRadMask == 0.05) : csCurrentLine.Format("\%ADD%2d%C,%6.4f*\%",iDrawApertureMask,fCornerRadMask) ; 원하는 (예 : csCurrentLine 의 문자열 내용)"% ADD87C, 0.0500 * % "

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.