คุณจะหลีกเลี่ยงสัญญาณ% เมื่อใช้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 *% "