ใน C คำสั่ง printf แบบยาวสามารถแบ่งออกเป็นหลายบรรทัดได้หรือไม่?


88

ฉันมีข้อความต่อไปนี้:

ฉันต้องการที่จะทำลายมัน ฉันลองทำตามขั้นตอนต่อไปนี้ แต่ไม่ได้ผล

ฉันจะทำลายมันได้อย่างไร?


1
คำแนะนำที่ดีบางอย่างที่ให้มา แต่ทั้งสองข้ออาจไม่ชัดเจนหรือดูแลรักษาได้เท่ากับการเรียก printf () สี่สายที่แยกจากกัน
Clifford

@Clifford: จากนั้นคุณสามารถเขียน C ++ เพื่อให้ cout ดูดีขึ้นสำหรับคุณ
ทดสอบ

คำตอบ:


175

หากคุณต้องการแบ่งสตริงลิเทอรัลออกเป็นหลายบรรทัดคุณสามารถต่อสตริงหลาย ๆ สตริงเข้าด้วยกันทีละบรรทัดได้ดังนี้:


86
เพียงแค่แสดงความคิดเห็นเพื่ออธิบายข้อเท็จจริงเกี่ยวกับ C ที่ไม่ค่อยมีใครรู้ว่าช่องว่างระหว่างสองสตริงคือการต่อกัน
Brian Postow

2
@Lundin การมีตัวแปรแต่ละตัวและค่าที่แสดงอย่างชัดเจนในบรรทัดของตัวเองนั้นง่ายต่อการอ่านมากสำหรับฉัน คุณนึกภาพออกไหมว่าดีบักเกอร์ใน IDE ที่ใส่ตัวแปรและค่าทั้งหมดลงในบรรทัดเดียว ฉันทำไม่ได้ (ใช่ฉันรู้ว่ามันไม่ได้ใส่อักขระขึ้นบรรทัดใหม่ระหว่างแต่ละสตริง แต่ฉันกำลังเปรียบเทียบความสามารถในการอ่านของซอร์สโค้ดกับความสามารถในการอ่านของตัวแปรในดีบักเกอร์)
x หรือ

การเชื่อมต่อนี้ทำโดยตัวประมวลผลล่วงหน้าหรือไม่?
เดบิวต์

23

คอมไพเลอร์ C สามารถกาวตัวอักษรสตริงที่อยู่ติดกันให้เป็นหนึ่งเดียวเช่น

ตัวประมวลผลก่อนสามารถใช้แบ็กสแลชเป็นอักขระสุดท้ายของบรรทัดโดยไม่นับ CR (หรือ CR / LF หากคุณมาจาก Windowsland):


6
ข้อแรกได้รับการแนะนำแล้วส่วนที่สองทนทุกข์ทรมานจากความจริงที่ว่ามันแตกหากมีช่องว่างหลังเครื่องหมาย '\'; ข้อบกพร่องที่อาจทำให้สับสนเมื่อเกิดขึ้น
Clifford

1
ทั้งสองตัวอย่างนั้นไม่มีอะไรเกี่ยวข้องกับตัวประมวลผลก่อนหน้า C เลย
Dan Moulding

@Dan cpp ของฉันดูเหมือนจะเข้าใจ / (ดูการแก้ไขของฉันด้านบน) ฉันไม่แน่ใจว่านี่เป็นพฤติกรรมมาตรฐานหรือไม่
sigjuice

@Dan ในขณะที่การรวมตัวอักษรที่อยู่ติดกันอาจดำเนินการกับพรีโปรเซสเซอร์หรือคอมไพเลอร์ (ในขั้นตอนสุดท้ายก่อนการคอมไพล์จริง) การจัดการความต่อเนื่องของบรรทัดจะดำเนินการโดยตัวประมวลผลล่วงหน้าเนื่องจากไม่สามารถใช้มาโครหลายบรรทัดได้ ดูได้ที่นี่ - gcc.gnu.org/onlinedocs/cpp/Initial-processing.html
qrdl

2
@qrdl: ฉันไม่ดีคุณพูดถูกเกี่ยวกับอันที่สอง การต่อเนื่องของบรรทัดจะกระทำโดยพรีโปรเซสเซอร์เสมอ บางครั้งฉันต้องได้รับการเตือนว่าฉันไม่ใช่คนรู้เรื่องทั้งหมด;) ฉันยังคิดว่าในกรณีปกติคอมไพเลอร์จะรวมตัวอักษรสตริง
แดนปั้น

20

ตัวเลือกการจัดรูปแบบอื่น ๆ :

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


ไม่มีอะไรใช้งานได้ที่นี่ แต่เป็นแนวคิดใหม่ที่ฉันไม่เคยเห็นมาก่อน ชอบมากความคิดเห็นที่ดี @pmg!
rpj

3

วิธีมาตรฐานโดยพฤตินัยในการแยกฟังก์ชันที่ซับซ้อนใน C คือต่ออาร์กิวเมนต์:

หรือหากคุณต้องการ:

คุณไม่ควรแยกสตริงและไม่ควรใช้\เพื่อทำลายสาย C รหัสดังกล่าวเปลี่ยนเป็นอ่านไม่ได้ / ไม่สามารถเข้าถึงได้อย่างรวดเร็ว


3

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

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