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

274

Jak uniknąć znaku% podczas używania printfw C?

printf("hello\%"); /* not like this */
Chris_45
źródło

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: %%

Pablo Santa Cruz
źródło
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.]

Mikeage
źródło
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.

Sinan Ünür
źródło
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
10

Z samym sobą ...

printf("hello%%"); /* like this */
Martin Clayton
źródło
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).

pmg
źródło
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
6

użyj podwójnego %%

Jldupont
źródło
4

Lubię to:

printf("hello%%");
//-----------^^ inside printf, use two percent signs together
Salman A.
źródło
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%.

Ralph M. Rickenbach
źródło
3

Możesz użyć %%:

printf("100%%");

Wynik to:

100%

Kaczor Donald
źródło
3

używasz niepoprawnego specyfikatora formatu, którego powinieneś użyć %%do drukowania %. Twój kod powinien być:

printf("hello%%");  

Czytaj dalej wszystkie specyfikatory formatu używanego w C .

Pankaj Prakash
źródło
2

Tak, użyj printf („hello %%”); i gotowe.

Kevin
źródło
2

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

Przykład:

printf("You gave me 12.3 %% of profit");
Md Shahriar
źródło
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 *% „

dindea
źródło