fgets รอ "\ n" ก่อนที่จะรับอินพุตไปยังบัฟเฟอร์ [ซ้ำ]

Jan 02 2021

ฉันพยายามใช้ fgets จาก stdin และเริ่มรวบรวมข้อมูลจากหน้าจอหลังจากที่ฉันพิมพ์ '\ n' เท่านั้น จนกว่า "\ n" จะติด

หมายเหตุ: ฉันไม่มี scanf ในรหัสของฉัน

ส่วนที่เกี่ยวข้องของรหัส:

while (reconnect_flag)
    {
        printf("%s\n", RECONNECT_MENU);
        char Input[2] = "";
        fgets(Input, 2, stdin);
    }

คำตอบ

JonathanLeffler Jan 03 2021 at 22:43

เนื่องจากfgets()มีวัตถุประสงค์เพื่ออ่านบรรทัดข้อมูลจนถึงและรวมถึงการขึ้นบรรทัดใหม่แรก (หรือถึง EOF) จึงมีพฤติกรรมตามที่ตั้งใจไว้

นอกจากนี้หากคุณไม่ทำอะไรบางอย่างกับการตั้งค่าเทอร์มินัลเทอร์มินัลจะไม่ส่งเนื้อหาของบรรทัดข้อมูลไปยังโปรแกรมที่อ่านจากเทอร์มินัลจนกว่าคุณจะขึ้นบรรทัดใหม่ ดูอินพุตเทอร์มินัล Canonical เทียบกับที่ไม่ใช่ Canonicalสำหรับข้อมูลเพิ่มเติมจากมุมมอง POSIX (Unix) ดังนั้นการพยายามอ่านอักขระหนึ่งตัวผ่านfgets(Input, 2, stdin)จะไม่ได้รับอินพุตใด ๆ จนกว่าจะขึ้นบรรทัดใหม่

คุณต้องทำงานกับ API เฉพาะแพลตฟอร์มหากคุณต้องการอินพุตทันทีที่พร้อมใช้งาน นั่นหมายความว่าสิ่งที่คุณทำบน Windows จะแตกต่างจากสิ่งที่คุณทำบนระบบที่ใช้ POSIX นั่นคือรสชาติต่างๆของ Unix รวมถึง Linux แม้ในระบบที่ใช้ POSIX คุณอาจใช้cursesไลบรารีหรืออาจใช้การเรียกระบบระดับล่างและมีหลายวิธีในการดำเนินการ