Odpowiedzi:
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: %%
%
jest specyficzna printf
, prawda?
\045
jest ucieczką w czasie kompilacji, która jest częścią języka i zmieni się %
podczas kompilacji. printf
jest 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, printf
jest „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);
.
printf("hello%c", '%');
. Jest jednak %%
lepszy, ponieważ nie używa innego argumentu.
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.]
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, puts
dołącza a \n
do wyniku i fputs
nie.
puts
. Nigdy nie myślałem o puts
drukowaniu napisów i od razu podskoczyłem printf
. Nigdy więcej.
Z samym sobą ...
printf("hello%%"); /* like this */
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).
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%.
Możesz użyć %%:
printf("100%%");
Wynik to:
100%
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 .
Możesz po prostu użyć %
dwukrotnie"%%"
Przykład:
printf("You gave me 12.3 %% of profit");