3
Hàm fflush(stdin) không thể dừng màn hình Console trong C?
0
vantungpqs20 đã đăng:

Theo như câu hỏi Có những cách đọc chuỗi ký tự nhập từ bàn phím nào trong C? thì trong trường hợp nếu màn hình Console không dừng lại để bạn nhập chuỗi vào bạn có thể dùng thêm dòng fflush(stdin) trước hàm fgets().

Ok, nó hoạt động bình thường nhưng khi mình sử dụng chung chúng lồng trong câu lệnh switch thì màn hình Console không dừng lại nữa mặc dù vẫn có dòng fflush(stdin) trước hàm fgets().

switch (n)
{
case 1:
    printf("Nhap vao chuoi: ");
    fflush(stdin);
    fgets(A, 100, stdin);
default:
    break;
}

Mình không hiểu nguyên nhân tại sao, cần bất cứ sự giúp đỡ nào ạ, thanks.

thêm bình luận...
2
minhkiet150 đã đăng:

Hình như đoạn mã nguồn trên bạn đăng chỉ có 1 phần thôi nhỉ, và mình đoán là trước đó có thêm vài câu lệnh nhập và đọc dữ liệu nữa, bởi vì sau khi đọc dữ liệu lần đầu tiên từ màn hình Console, ký tự \n sẽ bị dính lại trong bộ nhớ tạm do bạn nhấn phím Enter, do đó bộ nhớ tạm chưa được dọn sạch trước khi qua tới câu lệnh đọc dữ liệu tiếp theo, cụ thể ở đây là hàm fgets() sẽ đọc luôn ký tự \n thay vì dừng lại cho bạn nhập dữ liệu mới.

Sử dụng fflush(stdin) là bad và nên tránh, bởi vì theo định nghĩa chuẩn của C, hàm fflush(stdin) chỉ dùng cho stdout, không phải stdin mặc dù nó vẫn được chấp nhận trong hệ điều hành Windows và Visual Studio phiên bản cũ, nhưng ở phiên bản mới hơn như Visual Studio 2017 (đã test) và hệ điều hành Linux, fflush(stdin) không còn hoạt động như mong đợi nữa.

Thay vào đó, bạn nên sử dụng một cách khác để dọn dẹp bộ nhớ tạm trước khi đọc dữ liệu mới:

while (getchar() != '\n');

Bạn có thể chạy thử đoạn chương trình dưới đây:

#include <stdio.h>
#include <conio.h>

int main() {
    char A[100];
    int n;

    printf("Nhap vao 1 so: ");
    scanf_s("%d", &n);

    printf("Nhap vao 1 chuoi: ");
    while (getchar() != '\n');
    fgets(A, 100, stdin);

    printf("Chuoi vua nhap: %s", A);
}
đã bổ sung 5.4 năm trước bởi
Avatar: B-Editor B-Editor0
thêm bình luận...
1
Tuấn Long80 đã đăng:

Bộ nhớ tạm buffer bị mắc kẹt lại với ký tự \n cho nên hàm fgets() sẽ đọc luôn ký tự này, kết quả là màn hình Console bị bỏ qua, bạn có thể xóa bộ nhớ tạm trước khi lưu vào dữ liệu mới.

Đặt dòng lệnh bên dưới vào trước fgets(), mọi thứ sẽ hoạt động bình thường.

setbuf(stdin, NULL);

Hope it help.

đã bổ sung 5.4 năm trước bởi
Avatar: Tuấn Long Tuấn Long80
thêm bình luận...
0
trungkfc02570 đã đăng:

Sử dụng rewind(stdin) thay cho fflush(stdin) cũng có thể hoạt động một cách trơn tru.

printf("Nhap vao 1 so: ");
scanf_s("%d", &n);

printf("Nhap vao 1 chuoi: ");
rewind(stdin);
fgets(A, 100, stdin);
đã bổ sung 5.4 năm trước bởi
Avatar: trungkfc02 trungkfc02570
thêm bình luận...
Bạn đang thắc mắc? Ghi câu hỏi của bạn và đăng ở chế độ cộng đồng (?)