แผ่นพิมพ์ด้านซ้ายที่มีช่องว่าง


114

ฉันจะวางสตริงที่มีช่องว่างทางด้านซ้ายเมื่อใช้ printf ได้อย่างไร

ตัวอย่างเช่นฉันต้องการพิมพ์ "สวัสดี" โดยมีช่องว่าง 40 ช่องนำหน้า

นอกจากนี้สตริงที่ฉันต้องการพิมพ์ประกอบด้วยหลายบรรทัด ฉันจำเป็นต้องพิมพ์แต่ละบรรทัดแยกกันหรือไม่?

แก้ไข: เพื่อความชัดเจนฉันต้องการให้พิมพ์ 40 ช่องว่างก่อนทุกบรรทัด

คำตอบ:


125

หากคุณต้องการให้คำว่า "Hello" พิมพ์ในคอลัมน์ที่มีความกว้าง 40 อักขระโดยเว้นวรรคด้านซ้ายให้ใช้สิ่งต่อไปนี้

char *ptr = "Hello";
printf("%40s\n", ptr);

ซึ่งจะทำให้คุณมีช่องว่าง 35 ช่องตามด้วยคำว่า "สวัสดี" นี่คือวิธีที่คุณจัดรูปแบบสิ่งต่างๆเมื่อคุณรู้ว่าคุณต้องการคอลัมน์กว้างแค่ไหน แต่ข้อมูลเปลี่ยนไป (ก็เป็นวิธีหนึ่งที่คุณสามารถทำได้)

ถ้าคุณรู้ว่าคุณต้องการช่องว่าง 40 ช่องแล้วก็ให้บันทึกช่องว่าง 40 ช่องเป็นค่าคงที่แล้วพิมพ์ หากคุณต้องการพิมพ์หลายบรรทัดให้ใช้printfคำสั่งหลาย ๆคำสั่งเช่นเดียวกับด้านบนหรือทำวนซ้ำโดยเปลี่ยนค่าของptrแต่ละครั้ง


3
อย่ามากเกินไปเกี่ยวกับแฟล็กรูปแบบ แต่ฉันสงสัยว่า printf ("% 40s% s \ n", "", ptr); ใช้รองพื้นที่ 40 ช่องได้ด้วยเหรอ?
Johannes Schaub - litb

ใช่นั่นจะทำให้คุณมีช่องว่าง 40 ช่องก่อนเนื้อหาของตัวชี้เสมอ นั่นเป็นทางออกที่ดี แต่ถ้าคุณต้องทำมาก ๆ ฉันคิดว่าค่าคงที่ที่มีช่องว่าง 40 ช่องจะเร็วกว่า ฉันไม่รู้ว่าคอมไพเลอร์สามารถปรับแต่งรูปแบบ printf ให้เหมาะสมได้หรือไม่
Bill the Lizard

38
นอกจากนี้หากคุณมีตัวแปร int 'n' ที่มีจำนวนช่องว่างที่จะรวมคุณสามารถใช้: printf ("% * s% s \ n", n, "", ptr); เพื่อรับจำนวนช่องว่างตัวแปร
Jonathan Leffler

และหากต้องการระบุส่วนสุดท้ายของ Q: ใช่หากคุณต้องการให้พิมพ์ข้อมูลแต่ละบรรทัดโดยมีช่องว่างนำหน้า 40 ช่องคุณจะต้องแบ่งกลุ่มข้อมูลเพื่อให้แต่ละบรรทัดพิมพ์แยกกัน
Jonathan Leffler

4
@Jonathan Leffler: แน่นอนว่าคอมไพเลอร์สามารถปรับรูปแบบ printf ให้เหมาะสมได้ ตัวอย่างเช่น GCC เพิ่มประสิทธิภาพ printf ("% s \ n", foo) และแทนที่ด้วย puts (foo)
sam hocevar

73

ฉันใช้ฟังก์ชันนี้เพื่อเยื้องผลลัพธ์ของฉัน (ตัวอย่างเช่นเพื่อพิมพ์โครงสร้างต้นไม้) indentคือจำนวนของช่องว่างก่อนสตริง

void print_with_indent(int indent, char * string)
{
    printf("%*s%s", indent, "", string);
}

7
ฉันชอบที่คุณใช้การต่อตัวอักษรสตริงเพื่อแยกการเยื้องออกจากส่วนที่เหลือของรูปแบบ printf คำแนะนำเดียว: ใช้สตริงว่างแทนช่องว่างเดียวสำหรับสตริงเยื้อง การเยื้อง == 0 จะทำงานตามที่คาดไว้ (เช่นprintf(..., indent, "", ...))
ɲeuroburɳ

หมายเหตุ Ray Hulha ได้ลบการต่อตัวอักษรสตริงออกอย่างเห็นได้ชัดเพื่อแก้ไข "ปัญหาคอมไพเลอร์"
mwfearnley

42
int space = 40;
printf("%*s", space, "Hello");

คำสั่งนี้จะจองแถวที่มีอักขระ 40 ตัวพิมพ์สตริงที่ท้ายแถว (ลบช่องว่างพิเศษเพื่อให้ความยาวของแถวทั้งหมดคงที่ที่ 40) สามารถใช้เหมือนกันสำหรับอักขระและจำนวนเต็มดังนี้:

printf("%*d", space, 10);
printf("%*c", space, 'x');

วิธีการนี้โดยใช้พารามิเตอร์เพื่อกำหนดช่องว่างมีประโยชน์เมื่อต้องการจำนวนช่องว่างตัวแปร คำสั่งเหล่านี้จะยังคงใช้ได้กับตัวอักษรจำนวนเต็มดังนี้:

printf("%*d", 10, 10);
printf("%*c", 20, 'x');
printf("%*s", 30, "Hello");

หวังว่านี่จะช่วยคนอย่างฉันในอนาคต


ฉันได้รับ error: empty character constantสำหรับ''. ควร' 'หรือไม่?
Jin Kwon

ใช่มันควร
shjeff

@JinKwon ตัวละครใด ๆ เช่นเดียวกับ"Hello"อะไรก็ได้เขาควรจะใช้ตัวอย่าง
joe pelletier

18

หากคุณต้องการให้มีช่องว่าง 40 ช่องก่อนสตริงคุณควรทำดังนี้

printf("                                        %s\n", myStr );

หากสิ่งนั้นสกปรกเกินไปคุณสามารถทำได้ (แต่จะช้ากว่าการพิมพ์ 40 ช่องว่างด้วยตนเอง): printf("%40s%s", "", myStr );

หากคุณต้องการให้สตริงเรียงกันที่คอลัมน์ 40 (นั่นคือมีมากถึง 39 ช่องว่างโดยดำเนินการให้อักขระที่ถูกต้องที่สุดอยู่ในคอลัมน์ 40) ให้ทำสิ่งนี้: printf("%40s", myStr);

คุณยังสามารถใส่ "สูงสุด" 40 ช่องว่างหลังสตริงได้โดยทำ printf("%-40s", myStr);


2
ชอบความคิดเห็นนี้สำหรับช่องว่างหลังสตริง
oneat
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.