Jak uniknąć znaku% podczas używania printf
w C?
printf("hello\%"); /* not like this */
c
printf
format-string
Chris_45
źródło
źródło
%
jest specyficznaprintf
, 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” iprintf("This is a's value: %s\n", a);
daje taki sam rezultat jakprintf("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ć:
Ilekroć musisz wydrukować ciąg, zawsze, zawsze, zawsze wydrukuj go za pomocą
aby zapobiec powodowaniu problemów przez osadzony% [naruszenia pamięci, awarie itp.]
źródło
Jeśli w ciągu nie ma formatów, możesz użyć
puts
(lubfputs
):jeśli w ciągu znajduje się format:
Jak zauważono w komentarzach,
puts
dołącza a\n
do wyniku ifputs
nie.źródło
puts
. Nigdy nie myślałem oputs
drukowaniu napisów i od razu podskoczyłemprintf
. Nigdy więcej.Z samym sobą ...
źródło
Nitpick:
Naprawdę nie uciekasz
%
od ciągu, który określa format rodziny funkcjiprintf()
(iscanf()
).%
Wprintf()
(iscanf()
) 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).źródło
użyj podwójnego %%
źródło
Lubię to:
źródło
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%.
źródło
Możesz użyć %%:
Wynik to:
źródło
używasz niepoprawnego specyfikatora formatu, którego powinieneś użyć
%%
do drukowania%
. Twój kod powinien być:Czytaj dalej wszystkie specyfikatory formatu używanego w C .
źródło
Tak, użyj printf („hello %%”); i gotowe.
źródło
Możesz po prostu użyć
%
dwukrotnie"%%"
Przykład:
źródło
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 *% „źródło