Jak uciec znak % (procent) w printf C?

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

printf("hello\%"); /* not like this */
Author: nwellnhof, 2009-12-07

13 answers

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

Używając Twojego przykładu:

printf("hello%%");

Znak specjalny '%' jest tylko dla printf. Jeśli tak:

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

Wydrukuje: This is a's value: %%

 445
Author: Pablo Santa Cruz,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-03-27 13:06:38

Jak mówili inni, % % ucieknie %.

Zauważ jednak, że nigdy nie powinieneś tego robić:

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

Kiedy musisz wydrukować ciąg znaków, zawsze, zawsze, zawsze wydrukuj go za pomocą

printf("%s", c)

Aby zapobiec osadzonemu % z powodowaniem problemów [naruszenia pamięci, segfault, itp]

 37
Author: Mikeage,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-12-07 14:06:41

Jeśli w łańcuchu nie ma formatów, możesz użyć puts (lub fputs):

puts("hello%");

Jeśli w łańcuchu jest format:

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

Jak wspomniano w komentarzach, puts dodaje \n do wyjścia, a fputs nie.

 33
Author: Sinan Ünür,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-12-08 12:19:32

Z samym sobą...

printf("hello%%"); /* like this */
 11
Author: martin clayton,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-12-07 14:03:58

Nitpick:
Tak naprawdę nie unikasz % w łańcuchu, który określa format dla rodziny funkcji printf() (i scanf()).

%, w rodzinie funkcji printf() (i scanf()), rozpoczyna specyfikację konwersji. Jedna z reguł specyfikacji konwersji mówi, że % jako specyfikator konwersji (bezpośrednio po %, który rozpoczął specyfikację konwersji) powoduje, że znak '%' jest zapisywany bez argumentu nawrócony.

Łańcuch naprawdę ma 2 '%' znaki wewnątrz (w przeciwieństwie do znaków specjalnych: "a\bc" jest łańcuchem z 3 znakami Nie null; "a%%b" jest łańcuchem z 4 znakami Nie null).

 7
Author: pmg,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-12-07 14:28:42

Użyj podwójnego % %

 6
Author: jldupont,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-12-07 14:04:10

Tak:

printf("hello%%");
//-----------^^ inside printf, use two percent signs together
 4
Author: Salman A,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-12-07 14:28:18

Możesz użyć %%:

printf("100%%");

Wynik jest następujący:

100%

 4
Author: Donald Duck,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-08-19 14:38:55

Używasz nieprawidłowego formatu, powinieneś użyć %% do drukowania %. Twój kod powinien brzmieć:

printf("hello%%");  

Czytaj więcej Wszystkie SPECYFIKATORY FORMATU używane w C .

 4
Author: Pankaj Prakash,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-08-28 13:53:57

Odwrotny ukośnik w C jest używany do ucieczki znaków w łańcuchach. Łańcuchy znaków nie rozpoznają % jako znaku specjalnego i dlatego nie będzie konieczna Ucieczka. printf to inna sprawa: użyj %%, aby wydrukować %.

 3
Author: Ralph M. Rickenbach,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2020-07-04 15:30:41

Możesz po prostu użyć % dwa razy, czyli "%%"

Przykład:

printf("You gave me 12.3 %% of profit");
 2
Author: Md Shahriar,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-07-23 20:21:58

Yup, użyj printf("hello%%"); i gotowe.

 2
Author: Kevin,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2020-07-04 15:29:48

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) ; podaje żądaną i oczekiwaną wartość (string contents in) csCurrentLine; "%ADD87C, 0.0500* % "

 1
Author: dindea,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-10-21 17:35:01