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?
\045adalah kompilasi waktu melarikan diri yang merupakan bagian dari bahasa dan akan berubah menjadi %ketika dikompilasi. printfadalah 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, printfadalah "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, putstambahkan a \nke output dan fputstidak.
puts. Saya tidak pernah berpikir putsuntuk 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 *% "