C'nin printf içindeki% (yüzde) işaretinden nasıl kaçılır?


274

printfC ile kullanırken% işaretinden nasıl kaçıyorsunuz ?

printf("hello\%"); /* not like this */

Yanıtlar:


421

Bunun gibi bir çift '%' göndererek kaçabilirsiniz: %%

Örneğinizi kullanma:

printf("hello%%");

'%' İşaretinden kaçmak sadece printf içindir. Yaparsan:

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

Yazdırılacak: This is a's value: %%


8
"Printf (" Merhaba %% ");" doğrudur. Ama bence bu bir kaçış değil. printf ("merhaba \ 045") kullanın;
Lai Jiangshan

1
@Pablo Santa Cruz: Bu "kaçış" yöntemine %özgüdür printf, değil mi?
Lazer

10
Bu, kaçış sistemlerinde gerçek bir kaçış simgesi elde etmek için <kaçış simgesi> <kaçış simgesi> kullandığınız çok yaygın bir kuralın özel bir örneğidir.
dmckee --- eski moderatör kedi yavrusu

12
Lai Jiangshan, bu işe yaramayacak. dilin bir\045 parçası olan ve derlendiğinde dönüşecek olan derleme zamanı kaçışıdır. bir çalışma zamanı işlevidir, bu nedenle C kaynak koduyla değil dizenizin baytlarıyla ilgilenir ve işlevin parçaları olan kendi kaçış dizilerine sahiptir . Kısacası, "bir dilin içindeki dil" dir ve aynı sonucu verir . %printfprintfprintf("This is a's value: %s\n", a);printf("This is a's value: \045\0163\012", a);
Triang3l

5
Ayrıca, bunu yapabilirsiniz: printf("hello%c", '%');. Ancak, %%başka bir argüman kullanmadığı için daha iyidir.
Triang3l

36

Diğerlerinin söylediği gibi, %%% 'den kaçacaktır.

Ancak, bunu asla yapmamanız gerektiğini unutmayın:

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

Bir dizeyi her yazdırmanız gerektiğinde, her zaman, her zaman, her zaman

printf("%s", c)

gömülü bir% 'nin soruna neden olmasını önlemek için [bellek ihlalleri, segfault vb.]


Uyarı genellikle uygundur, ancak sağladığınız dizenin bir biçim dizesi olarak yorumlanacağını bildiğiniz sürece "bu" yapmak istediğiniz durumlar olabilir.
PP.

2
Bir kez alternatif bir çözüm buldum - tamponu başka bir tampona kopyalayın ve sonra% işaretlerini ikiye katlayın. Sonunda bu fikre rastladım ve 20-30 hat fonksiyonunu bir hatla değiştirdim. Endişelenme, hak ettiğim gibi kendimi kafa hakkında ciddi bir şekilde dövdüm.
Graeme Perrow

Doğru, ancak bir biçim dizesi aldığınızda% 99'unun, bağımsız değişkenleri va_list olarak aldığını unutmayın, bu yüzden vprintf kullanmanız gerekir. Böylece, teknik olarak
doğruyum

2
Koyar yapmak çok daha kolaydır (c). Eğer
William Pursell

1
koyar yeni satır ekler. Bu genellikle istenmeyen davranışlardır.
Mikeage

33

Dizede biçim yoksa, puts(veya fputs) öğesini kullanabilirsiniz :

puts("hello%");

dizede bir biçim varsa:

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

Yorumlarda belirtildiği gibi , çıktıya putsa ekler \nve fputseklemez.


4
Doğrudan fprintf () 'e karşılık verdiği için fputs ()' dan bahsetmeye değer.
Tim Post

1
koyarlar [zaten varsa bile] yeni bir satır ekler. Eğer istersen, harika. Aksi takdirde ...
Mikeage

@Sinan Ünür: bana hatırlattığın için teşekkürler puts. putsDizeleri basmayı hiç düşünmedim ve doğrudan atladım printf. Artık değil.
Lazer


7

Nitpick: (ve ) işlev ailesi için biçimi belirten dizede
gerçekten kaçmazsınız .%printf()scanf()

%İçinde printf()(ve scanf()fonksiyonların) ailesi, bir dönüşüm şartname başlar. Dönüştürme belirtimi kurallarından biri, %bir dönüşüm belirteci olarak ( %dönüştürme belirtimini başlatan hemen sonra ) bir '%'karakterin dönüştürülmüş argüman olmadan yazılmasına neden olduğunu belirtir .

Dizenin içinde gerçekten 2 '%'karakter vardır (kaçan karakterlerin aksine: "a\bc"3 boş karakter olmayan "a%%b"bir dizedir; 4 boş karakter olmayan bir dizedir).


2
teknik olarak, hala "kaçıyor"; özel karakterler özel anlamlarını "kaçmak" ve onların "karakter doğa" geri olmak için bir yol gerekir
ShinTakezou


4

Bunun gibi:

printf("hello%%");
//-----------^^ inside printf, use two percent signs together

3

C'deki ters eğik çizgi, dizelerdeki karakterlerden kaçmak için kullanılır. Dizeler% 'i özel bir karakter olarak tanımaz ve bu nedenle kaçış gerekmez. Printf başka bir konudur: %% öğesini yazdırmak için %% kullanın.




2

Evet, printf ("merhaba %%") kullanın; ve bitti.


2

Sadece %iki kez kullanabilirsiniz , yani"%%"

Misal:

printf("You gave me 12.3 %% of profit");

1

Çift '%', ".Format (…). Örnekte de çalışır. Örnek (iDrawApertureMask == 87, fCornerRadMask == 0.05 ile): csCurrentLine.Format("\%ADD%2d%C,%6.4f*\%",iDrawApertureMask,fCornerRadMask) ; csCurrentLine;"% ADD87C, 0.0500 *% istenen ve beklenen değerini verir "

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.