Jawaban:
Anda dapat menghindarinya dengan memposting ganda '%' seperti ini: %%
Menggunakan contoh Anda:
printf("hello%%");
Meloloskan tanda '%' hanya untuk printf. Jika kamu melakukan:
char a[5];
strcpy(a, "%%");
printf("This is a's value: %s\n", a);
Itu akan mencetak: This is a's value: %%
%
khusus untuk printf
, benar?
\045
adalah kompilasi waktu melarikan diri yang merupakan bagian dari bahasa dan akan berubah menjadi %
ketika dikompilasi. printf
adalah fungsi run-time, sehingga berhubungan dengan byte dari string Anda, bukan dengan kode sumber C, dan ia memiliki urutan pelarian sendiri yang merupakan bagian dari fungsi . Singkatnya, printf
adalah "bahasa di dalam bahasa", dan printf("This is a's value: %s\n", a);
memberikan hasil yang sama dengan printf("This is a's value: \045\0163\012", a);
.
printf("hello%c", '%');
. Namun, %%
lebih baik karena tidak menggunakan argumen lain.
Seperti yang orang lain katakan, %% akan lolos dari%.
Namun, perhatikan bahwa Anda tidak boleh melakukan ini:
char c[100];
char *c2;
...
printf(c); /* OR */
printf(c2);
Setiap kali Anda harus mencetak sebuah string, selalu, selalu, selalu cetak dengan menggunakan
printf("%s", c)
untuk mencegah embedded% dari menyebabkan masalah [pelanggaran memori, segfault, dll]
Jika tidak ada format dalam string, Anda dapat menggunakan puts
(atau fputs
):
puts("hello%");
jika ada format dalam string:
printf("%.2f%%", 53.2);
Seperti disebutkan dalam komentar, puts
tambahkan a \n
ke output dan fputs
tidak.
puts
. Saya tidak pernah berpikir puts
untuk mencetak string dan langsung melompat ke sana printf
. Tidak lagi.
Dengan sendirinya ...
printf("hello%%"); /* like this */
Nitpick:
Anda tidak benar-benar lepas dari %
string yang menentukan format untuk keluarga fungsi printf()
(dan scanf()
).
The %
, dalam keluarga fungsi printf()
(dan scanf()
), memulai spesifikasi konversi. Salah satu aturan untuk spesifikasi konversi menyatakan bahwa %
sebagai specifier konversi (segera setelah %
yang memulai spesifikasi konversi) menyebabkan '%'
karakter ditulis tanpa argumen yang dikonversi.
String benar-benar memiliki 2 '%'
karakter di dalamnya (sebagai lawan dari karakter melarikan diri: "a\bc"
adalah string dengan 3 karakter bukan nol; "a%%b"
adalah string dengan 4 karakter bukan nol).
Garis miring terbalik di C digunakan untuk melarikan diri karakter dalam string. String tidak akan mengenali% sebagai karakter khusus, dan oleh karena itu tidak ada jalan keluar yang diperlukan. Printf adalah masalah lain: gunakan %% untuk mencetak satu%.
Kamu bisa memakai %%:
printf("100%%");
Hasilnya adalah:
100%
Anda menggunakan penentu format yang salah yang harus Anda gunakan %%
untuk mencetak %
. Kode Anda harus:
printf("hello%%");
Baca lebih lanjut semua penentu format yang digunakan dalam C .
Anda cukup menggunakan %
dua kali, yaitu"%%"
Contoh:
printf("You gave me 12.3 %% of profit");
Dobel '%' juga berfungsi di ".Format (...). Contoh (dengan iDrawApertureMask == 87, fCornerRadMask == 0,05):
csCurrentLine.Format("\%ADD%2d%C,%6.4f*\%",iDrawApertureMask,fCornerRadMask) ;
memberikan nilai yang diinginkan dan diharapkan dari (isi string dalam) csCurrentLine;"% ADD87C, 0,0500 *% "