ในที่สุดฉันก็อ่านK&Rและฉันได้เรียนรู้บางอย่างในสองสามหน้าแรกว่ามีอักขระหลีกย้อน\b
กลับ
ดังนั้นฉันไปทดสอบดูและมีพฤติกรรมแปลก ๆ :
#include <stdio.h>
main ()
{
printf("hello worl\b\bd\n");
}
ผลลัพธ์คือ
hello wodl
ใครช่วยอธิบายเรื่องนี้
ในที่สุดฉันก็อ่านK&Rและฉันได้เรียนรู้บางอย่างในสองสามหน้าแรกว่ามีอักขระหลีกย้อน\b
กลับ
ดังนั้นฉันไปทดสอบดูและมีพฤติกรรมแปลก ๆ :
#include <stdio.h>
main ()
{
printf("hello worl\b\bd\n");
}
ผลลัพธ์คือ
hello wodl
ใครช่วยอธิบายเรื่องนี้
คำตอบ:
ผลลัพธ์ของคุณจะแตกต่างกันไปขึ้นอยู่กับประเภทของโปรแกรมเทอร์มินัลหรือคอนโซลที่คุณใช้งานอยู่ แต่ใช่ส่วนใหญ่\b
เป็นbackspace ที่ไม่ทำลาย มันเลื่อนเคอร์เซอร์ไปข้างหลัง แต่ไม่ได้ลบสิ่งที่อยู่ที่นั่น
ดังนั้นสำหรับhello worl
ส่วนนี้โค้ดจะแสดงผล
สวัสดี worl ^
... (ที่^
แสดงว่าเคอร์เซอร์อยู่ที่ไหน) จากนั้นจะแสดง\b
อักขระสองตัวซึ่งเลื่อนเคอร์เซอร์ไปข้างหลังสองตำแหน่งโดยไม่ต้องลบ (บนเทอร์มินัลของคุณ):
สวัสดี worl ^
สังเกตว่าตอนนี้เคอร์เซอร์อยู่ที่r
. จากนั้นจะส่งออกd
ซึ่งเขียนทับr
และให้เรา:
สวัสดี wodl ^
สุดท้ายผลลัพธ์จะออก\n
มาซึ่งเป็นบรรทัดใหม่ที่ไม่ทำลายล้าง (อีกครั้งในเทอร์มินัลส่วนใหญ่รวมถึงของคุณด้วย) ดังนั้นจึงl
ไม่เปลี่ยนแปลงและเคอร์เซอร์จะถูกย้ายไปที่จุดเริ่มต้นของบรรทัดถัดไป
r
จะถูกแทนที่ด้วยd
. คำอธิบายยังพอดี
cmd.exe
และcommand.com
เทอร์มินัลมักจะไม่แทรก (คุณสามารถใช้ปุ่ม Ins เพื่อสลับพฤติกรรม) ฉันรู้สึกประหลาดใจที่พบว่า Gnome Terminal ในคอมพิวเตอร์หลัก * nix ของฉันมักจะแทรกอยู่เสมอดูเหมือนว่าจะไม่มีความต้องการในการสลับน้อยกว่ามากนักโดยอิงจากปุ่ม Ins ไม่เคยสังเกตเห็นมาก่อน เห็นได้ชัดว่าฉันแทบไม่ต้องการการพิมพ์ :-)
.......... ^ <= ชี้ไปที่ "หัวพิมพ์"
/* part1 */
printf("hello worl");
สวัสดี worl ^ <= ชี้ไปที่ "หัวพิมพ์"
/* part2 */
printf("\b");
สวัสดี worl ^ <= ชี้ไปที่ "หัวพิมพ์"
/* part3 */
printf("\b");
สวัสดี worl ^ <= ชี้ไปที่ "หัวพิมพ์"
/* part4 */
printf("d\n");
สวัสดี wodl ^ <= ชี้ไปที่ "หัวพิมพ์" ในบรรทัดถัดไป
'\n'
ไม่มีการแสดงบนหน้าจอ สิ่งที่มีอยู่แล้วยังคงเหมือนเดิม ไม่ถูกแทนที่ด้วยช่องว่างหรือการแทนอักขระอื่นใด
หากคุณต้องการ backspace ที่ทำลายล้างคุณจะต้องมีสิ่งต่างๆเช่น
"\b \b"
เช่น backspace ช่องว่างและ backspace อื่น
\b
จะหมายถึงอักขระเอาต์พุตถัดไปจะเขียนทับ
0x7f
) ฉันนิ่งงัน
ไม่ยากเกินไปที่จะอธิบาย ... เช่นการพิมพ์hello worl
กดปุ่มลูกศรซ้ายสองครั้งพิมพ์d
และกดปุ่มลูกศรลง
อย่างน้อยนั่นคือวิธีที่ฉันอนุมานว่าเทอร์มินัลของคุณเชื่อมต่อกับรหัส\b
และ\n
เปลี่ยนเส้นทางผลลัพธ์ไปยังไฟล์และฉันพนันได้เลยว่าคุณจะได้อย่างอื่นทั้งหมด แม้ว่าคุณอาจต้องดูไบต์ของไฟล์เพื่อดูความแตกต่าง
[แก้ไข]
เพื่ออธิบายรายละเอียดเล็กน้อยสิ่งนี้printf
จะแสดงลำดับของไบต์: hello worl^H^Hd^J
โดยที่^H
อักขระ ASCII # 8 ^J
คืออักขระ ASCII # 10 สิ่งที่คุณเห็นบนหน้าจอขึ้นอยู่กับว่าเครื่องของคุณตีความรหัสควบคุมเหล่านั้นอย่างไร
ใช้ backspace เดียวหลังอักขระแต่ละตัว
printf("hello wor\bl\bd\n");