Jak uniknąć znaku% (procent) w printf C?


Odpowiedzi:


421

Możesz uciec od tego, zamieszczając podwójne „%” w następujący sposób: %%

Na twoim przykładzie:

printf("hello%%");

Znak ucieczki „%” dotyczy tylko printf. Jeśli zrobisz:

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

Wydrukuje: This is a's value: %%


8
„printf („ hello %% ”);” jest w porządku. Ale myślę, że to nie jest ucieczka. użyj printf („hello \ 045”);
Lai Jiangshan,

1
@Pablo Santa Cruz: ta metoda „ucieczki” %jest specyficzna printf, prawda?
Lazer

10
Jest to szczególny przypadek bardzo powszechnej zasady w systemach ucieczki, że aby uzyskać dosłowny symbol ucieczki, używasz <symbol ucieczki> <symbol ucieczki>.
dmckee --- były moderator kociąt

12
Lai Jiangshan, to nie zadziała. \045jest ucieczką w czasie kompilacji, która jest częścią języka i zmieni się %podczas kompilacji. printfjest funkcją czasu wykonywania, więc zajmuje się bajtami łańcucha, a nie kodem źródłowym C, i ma własne sekwencje specjalne, które są częściami funkcji . Krótko mówiąc, printfjest „językiem w języku” i printf("This is a's value: %s\n", a);daje taki sam rezultat jak printf("This is a's value: \045\0163\012", a);.
Triang3l

5
Ponadto, można to zrobić: printf("hello%c", '%');. Jest jednak %%lepszy, ponieważ nie używa innego argumentu.
Triang3l

36

Jak powiedzieli inni, %% ucieknie od%.

Pamiętaj jednak, że nigdy nie powinieneś tego robić:

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

Ilekroć musisz wydrukować ciąg, zawsze, zawsze, zawsze wydrukuj go za pomocą

printf("%s", c)

aby zapobiec powodowaniu problemów przez osadzony% [naruszenia pamięci, awarie itp.]


Ostrzeżenie jest ogólnie odpowiednie, jednak mogą wystąpić sytuacje, w których chcesz to zrobić - o ile wiesz, że podany ciąg znaków zostanie zinterpretowany jako ciąg formatu.
PP.

2
Raz wymyśliłem alternatywne rozwiązanie - skopiuj bufor do innego bufora, a następnie przejdź przez niego, podwajając znaki%. W końcu natknąłem się na ten pomysł i zastąpiłem funkcję 20-30 linii jedną linią. Nie martw się, tak mocno zasłużyłem sobie na głowę, jak na to zasłużyłem.
Graeme Perrow,

To prawda, ale nie zapominaj, że 99% czasu, kiedy otrzymasz ciąg formatu, otrzymujesz argumenty jako va_list, więc musisz użyć vprintf. Tak więc mam techniczną rację;)
Mikeage,

2
O wiele łatwiej jest robić put (c). Jeśli
William Pursell,

1
wstawia dołącza nowy wiersz. To często niepożądane zachowanie.
Mikeage,

33

Jeśli w ciągu nie ma formatów, możesz użyć puts(lub fputs):

puts("hello%");

jeśli w ciągu znajduje się format:

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

Jak zauważono w komentarzach, putsdołącza a \ndo wyniku i fputsnie.


4
Warto również wspomnieć o fputs (), ponieważ bezpośrednio odwraca się od fprintf ().
Tim Post

1
dodaje także nowy wiersz [nawet jeśli już go masz]. Jeśli tego chcesz, świetnie. W przeciwnym razie ...
Mikeage,

@Sanan Ünür: dziękuję za przypomnienie puts. Nigdy nie myślałem o putsdrukowaniu napisów i od razu podskoczyłem printf. Nigdy więcej.
Lazer


7

Nitpick:
Naprawdę nie uciekasz %od ciągu, który określa format rodziny funkcji printf()(i scanf()).

%W printf()(i scanf()) rodziny funkcji rozpoczyna specyfikacji konwersji. Jedna z reguł specyfikacji konwersji mówi, że %jako specyfikator konwersji (bezpośrednio po tej, %która rozpoczęła specyfikację konwersji) powoduje, że'%' zapisanie znaku bez konwersji argumentu.

Ciąg naprawdę zawiera 2 '%'znaki (w przeciwieństwie do znaków ucieczki: "a\bc"jest ciągiem zawierającym 3 znaki niepuste; "a%%b"jest łańcuchem zawierającym 4 znaki niepuste).


2
technicznie rzecz biorąc, wciąż „ucieka”; postacie, które są wyjątkowe, potrzebują sposobu na „ucieczkę” ich specjalnego znaczenia i powrotu do „charakteru postaci”
ShinTakezou


4

Lubię to:

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

3

Odwrotny ukośnik w C służy do zmiany znaczenia znaków w łańcuchach. Łańcuchy nie rozpoznają% jako znaku specjalnego i dlatego nie będzie konieczne ucieczka. Printf to inna sprawa: użyj %%, aby wydrukować jeden%.





2

Możesz po prostu użyć %dwukrotnie"%%"

Przykład:

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

1

Podwójne „%” działa również w „.Format (…). Przykład (z iDrawApertureMask == 87, fCornerRadMask == 0,05): csCurrentLine.Format("\%ADD%2d%C,%6.4f*\%",iDrawApertureMask,fCornerRadMask) ; daje pożądaną i oczekiwaną wartość (ciąg znaków w) csCurrentLine;„% ADD87C, 0,0500 *% „

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.