วิธีจัดรูปแบบสตริงโดยใช้ printf () เพื่อให้ได้ความยาวเท่ากันในเอาต์พุต


97

ฉันมีสองฟังก์ชั่นหนึ่งที่ผลิตข้อความเช่นStarting initialization...และอื่น ๆ ซึ่งการตรวจสอบรหัสกลับและผล"Ok", หรือ"Warning" "Error"อย่างไรก็ตามเอาต์พุตที่ผลิตมีความยาวต่างกัน:

Starting initialization...Ok.
Checking init scripts...Ok.

ฉันจะได้อะไรแบบนี้:

Starting initialization...       Ok.
Checking init scripts...         Ok.

คำตอบ:


164

คุณสามารถระบุความกว้างในฟิลด์สตริงเช่น

printf("%-20s", "initialization...");

จากนั้นสิ่งที่พิมพ์ด้วยฟิลด์นั้นจะถูกบุช่องว่างตามความกว้างที่คุณระบุ

-ซ้าย justifies ข้อความของคุณในฟิลด์ที่


130
อนิจจาฉันไม่ฉลาดพอที่จะนับว่าสูงขนาดนั้น อย่างไรก็ตามฉันเชื่อว่าผู้ถามฉลาดพอที่จะคาดเดาจากตัวอย่างของฉัน :)
Carl Smotricz

3
สิ่งที่ถูกต้องเป็นธรรม? ไม่มีธงใด ๆ ที่กล่าวถึงใน K&R
Ungeheuer

9
ความถูกต้องเป็นค่าเริ่มต้น หากไม่มี-ข้อมูลของคุณจะถูกต้องเหมาะสมในฟิลด์ที่คุณระบุความกว้างไว้
Carl Smotricz

25

printfอนุญาตให้จัดรูปแบบด้วยตัวระบุความกว้าง เช่น


printf( "%-30s %s\n", "Starting initialization...", "Ok." );

คุณจะใช้ตัวระบุความกว้างเชิงลบเพื่อระบุการจัดชิดซ้ายเนื่องจากค่าเริ่มต้นคือการใช้การจัดชิดขวา


20

นอกจากนี้หากคุณต้องการความยืดหยุ่นในการเลือกwidthคุณสามารถเลือกระหว่างหนึ่งในสองรูปแบบต่อไปนี้ (มีหรือไม่มีการตัดทอน):

int width = 30;
//no truncation uses %-*s
printf( "%-*s %s\n", width, "Starting initialization...", "Ok." );
// output is "Starting initialization...     Ok."

//truncated to the specified width uses %-.*s
printf( "%-.*s %s\n", width, "Starting initialization...", "Ok." ); 
// output is "Starting initialization... Ok."

13

นอกจากนี้ยังมี%nตัวปรับแต่งที่สามารถช่วยได้ในบางสถานการณ์ มันส่งคืนคอลัมน์ที่สตริงอยู่จนถึงตอนนี้ ตัวอย่าง: คุณต้องการเขียนหลายแถวที่อยู่ในความกว้างของแถวแรกเช่นตาราง

int width1, width2;
int values[6][2];
printf("|%s%n|%s%n|\n", header1, &width1, header2, &width2);

for(i=0; i<6; i++)
   printf("|%*d|%*d|\n", width1, values[i][0], width2, values[i][1]);

จะพิมพ์ 2 คอลัมน์ที่มีความกว้างเท่ากันของความยาวของสตริงทั้งสองheader1และheader2อาจมี ฉันไม่รู้ว่าการใช้งานทั้งหมดมี%nแต่ Solaris และ Linux ทำหรือไม่


การแก้ปัญหานี้ทำงาน แต่ทุกคนที่จะใช้เวลานี้และทำให้มันอยู่ในรหัสของพวกเขาควรจะตระหนักถึงความเสี่ยงของการแนะนำช่องโหว่หน่วยความจำ
Matthew Cole

0

นอกจากนี้ยังมีโซลูชันที่ค่อนข้างต่ำในการนับการเพิ่มช่องว่างด้วยมือเพื่อให้ข้อความของคุณเรียงกัน ไม่มีสิ่งใดป้องกันไม่ให้คุณรวมช่องว่างต่อท้ายในสตริงข้อความของคุณ


-2

เริ่มต้นด้วยการใช้แท็บที่\ tปรับปรุงตัวอักษร มันจะเลื่อนไปยังตำแหน่งคงที่ (คอลัมน์ศัพท์แสงขั้ว) อย่างไรก็ตามมันไม่ได้ช่วยอะไรหากมีความแตกต่างมากกว่าความกว้างของคอลัมน์ (4 ตัวอักษรถ้าฉันจำได้ถูกต้อง)

ในการแก้ไขปัญหานี้ให้เขียนข้อความ "OK / NOK" โดยใช้จำนวนแท็บคงที่ (5? 6? ลองใช้) จากนั้นส่งกลับ ( \ r ) โดยไม่ต้องซับใหม่และเขียนข้อความของคุณ


5
มีอันตรายเสมอที่สตริงจะยาวเกินกว่าแท็บหยุดดังนั้นการบังคับให้แท็บและข้อความที่เป็นผลลัพธ์จัดวางไม่ถูกต้อง
พีพี.

ไม่จริง ... ก่อนอื่นให้เขียนแท็บ OK / NOK จากนั้น / r เขียนวลีตอนนี้ / n วลีนี้สามารถเขียนทับ OK / NOK แต่วิธีของคุณดีกว่าฉันไม่รู้เกี่ยวกับเหตุผลเชิงลบ
jpinto3912
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.