fgets chờ '\ n' trước khi nhận đầu vào vào bộ đệm [trùng lặp]

Jan 02 2021

Tôi đang cố gắng sử dụng tiện ích từ stdin và nó chỉ bắt đầu thu thập dữ liệu từ màn hình sau khi tôi nhập '\ n'. cho đến khi '\ n' nó bị kẹt.

lưu ý: Tôi không có bất kỳ scanf nào trong mã của mình

phần có liên quan của mã:

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

Trả lời

JonathanLeffler Jan 03 2021 at 22:43

Vì fgets()được thiết kế để đọc một dòng dữ liệu, lên đến và bao gồm cả dòng mới đầu tiên (hoặc tới EOF), nó đang hoạt động như dự định.

Ngoài ra, trừ khi bạn làm điều gì đó lạ mắt với cài đặt đầu cuối, thiết bị đầu cuối sẽ không gửi nội dung của dòng dữ liệu đến các chương trình đang đọc từ thiết bị đầu cuối cho đến khi một dòng mới được nhấn. Xem Đầu vào thiết bị đầu cuối hợp quy và không hợp quy để biết thêm thông tin từ quan điểm POSIX (Unix). Vì vậy, cố gắng đọc một ký tự qua fgets(Input, 2, stdin)sẽ không nhận được bất kỳ đầu vào nào cho đến khi nhập một dòng mới.

Bạn phải làm việc với các API dành riêng cho nền tảng nếu bạn muốn đầu vào ngay khi có sẵn. Điều đó có nghĩa là những gì bạn làm trên Windows sẽ khác với những gì bạn làm trên các hệ thống dựa trên POSIX - các hương vị khác nhau của Unix, bao gồm cả Linux. Ngay cả trên các hệ thống dựa trên POSIX, bạn có thể sử dụng cursesthư viện hoặc bạn có thể sử dụng các lệnh gọi hệ thống cấp thấp hơn và có nhiều cách để thực hiện.