fgets รอ "\ n" ก่อนที่จะรับอินพุตไปยังบัฟเฟอร์ [ซ้ำ]
ฉันพยายามใช้ fgets จาก stdin และเริ่มรวบรวมข้อมูลจากหน้าจอหลังจากที่ฉันพิมพ์ '\ n' เท่านั้น จนกว่า "\ n" จะติด
หมายเหตุ: ฉันไม่มี scanf ในรหัสของฉัน
ส่วนที่เกี่ยวข้องของรหัส:
while (reconnect_flag)
{
printf("%s\n", RECONNECT_MENU);
char Input[2] = "";
fgets(Input, 2, stdin);
}
คำตอบ
เนื่องจากfgets()มีวัตถุประสงค์เพื่ออ่านบรรทัดข้อมูลจนถึงและรวมถึงการขึ้นบรรทัดใหม่แรก (หรือถึง EOF) จึงมีพฤติกรรมตามที่ตั้งใจไว้
นอกจากนี้หากคุณไม่ทำอะไรบางอย่างกับการตั้งค่าเทอร์มินัลเทอร์มินัลจะไม่ส่งเนื้อหาของบรรทัดข้อมูลไปยังโปรแกรมที่อ่านจากเทอร์มินัลจนกว่าคุณจะขึ้นบรรทัดใหม่ ดูอินพุตเทอร์มินัล Canonical เทียบกับที่ไม่ใช่ Canonicalสำหรับข้อมูลเพิ่มเติมจากมุมมอง POSIX (Unix) ดังนั้นการพยายามอ่านอักขระหนึ่งตัวผ่านfgets(Input, 2, stdin)
จะไม่ได้รับอินพุตใด ๆ จนกว่าจะขึ้นบรรทัดใหม่
คุณต้องทำงานกับ API เฉพาะแพลตฟอร์มหากคุณต้องการอินพุตทันทีที่พร้อมใช้งาน นั่นหมายความว่าสิ่งที่คุณทำบน Windows จะแตกต่างจากสิ่งที่คุณทำบนระบบที่ใช้ POSIX นั่นคือรสชาติต่างๆของ Unix รวมถึง Linux แม้ในระบบที่ใช้ POSIX คุณอาจใช้curses
ไลบรารีหรืออาจใช้การเรียกระบบระดับล่างและมีหลายวิธีในการดำเนินการ