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?
\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);.
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, putsdołącza a \ndo wyniku i fputsnie.
puts. Nigdy nie myślałem o putsdrukowaniu 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");