คุณจะหลีกเลี่ยงสัญญาณ% เมื่อใช้printfใน C ได้อย่างไร?
printf("hello\%"); /* not like this */
คุณจะหลีกเลี่ยงสัญญาณ% เมื่อใช้printfใน C ได้อย่างไร?
printf("hello\%"); /* not like this */
คำตอบ:
คุณสามารถหนีได้โดยโพสต์ '%' สองเท่าดังนี้ %%
ใช้ตัวอย่างของคุณ:
printf("hello%%");
การหลีกเลี่ยงสัญญาณ '%' ใช้สำหรับ printf เท่านั้น ถ้าคุณทำ:
char a[5];
strcpy(a, "%%");
printf("This is a's value: %s\n", a);
มันจะพิมพ์: This is a's value: %%
%นี้เฉพาะเจาะจงprintfใช่ไหม?
\045เป็นการหลบหนีเวลารวบรวมที่เป็นส่วนหนึ่งของภาษาและจะเปลี่ยนเป็น%เมื่อรวบรวม printfเป็นฟังก์ชั่นเวลาทำงานดังนั้นจึงมีข้อตกลงกับไบต์ของสตริงของคุณไม่ได้อยู่กับรหัสที่มา C และจะมีลำดับของตัวเองหลบหนีที่มีส่วนของฟังก์ชั่น ในระยะสั้นprintfคือ "ภาษาภายในภาษา" และให้ผลเช่นเดียวกับprintf("This is a's value: %s\n", a); printf("This is a's value: \045\0163\012", a);
printf("hello%c", '%');นอกจากนี้คุณยังสามารถทำเช่นนี้: อย่างไรก็ตาม%%ดีกว่าเพราะไม่ได้ใช้อาร์กิวเมนต์อื่น
ดังที่คนอื่น ๆ พูดกัน %% จะหลบหนี%
อย่างไรก็ตามโปรดทราบว่าคุณไม่ควรทำสิ่งนี้:
char c[100];
char *c2;
...
printf(c); /* OR */
printf(c2);
เมื่อใดก็ตามที่คุณต้องพิมพ์สตริงเสมอทุกครั้งจะพิมพ์โดยใช้เสมอ
printf("%s", c)
เพื่อป้องกัน% ฝังตัวจากการก่อให้เกิดปัญหา [การละเมิดหน่วยความจำ, segfault, ฯลฯ ]
หากไม่มีรูปแบบในสตริงคุณสามารถใช้puts(หรือfputs):
puts("hello%");
หากมีรูปแบบในสตริง:
printf("%.2f%%", 53.2);
ดังที่ระบุไว้ในความคิดเห็นต่อputsท้าย\nเอาต์พุตและfputsไม่
putsขอบคุณสำหรับการเตือนฉันเกี่ยวกับ ฉันไม่เคยคิดว่าสำหรับการพิมพ์สตริงและกระโดดตรงไปยังputs printfไม่อีกแล้ว.
ด้วยตัวเอง ...
printf("hello%%"); /* like this */
Nitpick:
คุณไม่ได้หลบหนี%ในสตริงที่ระบุรูปแบบสำหรับprintf()(และscanf()) ตระกูลฟังก์ชัน
%ในprintf()(และscanf()ครอบครัว) ฟังก์ชั่นเริ่มต้นข้อกำหนดการแปลง หนึ่งในกฎสำหรับสเปคการแปลงระบุว่า a %ในฐานะที่เป็นตัวระบุการแปลง (ทันที%ที่เริ่มสเปคการแปลง) ทำให้'%'อักขระถูกเขียนโดยไม่มีการแปลงอาร์กิวเมนต์
สตริงมี 2 ตัวอักษรจริง ๆ'%' (ตรงกันข้ามกับการหลีกเลี่ยงอักขระ: "a\bc"เป็นสตริงที่มีอักขระที่ไม่ใช่ null 3 ตัว"a%%b"คือสตริงที่มีอักขระที่ไม่ใช่ null 4 ตัว)
ใช้คู่ %%
แบบนี้:
printf("hello%%");
//-----------^^ inside printf, use two percent signs together
แบ็กสแลชใน C ใช้เพื่อหนีอักขระในสตริง สตริงจะไม่รู้จัก% เป็นอักขระพิเศษดังนั้นจึงไม่จำเป็นต้องมีการยกเว้น Printf เป็นอีกเรื่อง: ใช้ %% เพื่อพิมพ์หนึ่ง%
คุณสามารถใช้ได้ %%:
printf("100%%");
ผลลัพธ์คือ:
100%
คุณกำลังใช้รูปแบบที่ระบุไม่ถูกต้องคุณควรใช้สำหรับการพิมพ์%% %รหัสของคุณควรเป็น:
printf("hello%%");
อ่านเพิ่มเติมspecifiers ทุกรูปแบบที่ใช้ใน C
ใช่ใช้ printf ("hello %%"); และมันก็ทำ
คุณสามารถใช้%สองครั้งนั่นคือ"%%"
ตัวอย่าง:
printf("You gave me 12.3 %% of profit");
double '%' ยังทำงานใน ".Format (…) ตัวอย่าง (ด้วย iDrawApertureMask == 87, fCornerRadMask == 0.05):
csCurrentLine.Format("\%ADD%2d%C,%6.4f*\%",iDrawApertureMask,fCornerRadMask) ;
ให้ค่าที่ต้องการและคาดหวังของ (เนื้อหาสตริงใน) csCurrentLine;"% ADD87C, 0.0500 *% "