Trang 1 trên tổng số 2 12 Cuối cùngCuối cùng
Từ 1 tới 10 trên tổng số 14 kết quả

Đề tài: Cách dùng lệnh fflush(stdin)? Lệnh fflush(stdin) có tác dụng gì?

  1. #1
    Ngày gia nhập
    09 2010
    Nơi ở
    Hà Nôi
    Bài viết
    464

    Mặc định Cách dùng lệnh fflush(stdin)? Lệnh fflush(stdin) có tác dụng gì?

    Trong sách em viết: " Trc khi nhập dữ liệu kí tự hay xâu kí tự ta nên dùng lệnh"
    PHP Code:
    fflush(stdin
    Các anh cho em hỏi lênh này dùng để làm gì, các công dụng, ứng dụng của nó.
    Em xin cảm ơn!

  2. #2
    Ngày gia nhập
    08 2010
    Nơi ở
    Moscow, Russia Federation
    Bài viết
    913

    stdin là dòng vào tiêu chuẩn(bàn phím). Các hàm scanf, gets, getchar ... đều nhận dữ liệu từ stdin.
    Nếu trên stdin có đủ dữ liệu thì các hàm trên sẽ chỉ nhận một phần dữ liệu mà chúng yêu cầu. Phần dữ liệu còn lại(chưa được nhận) vẫn ở lại trên dòng nhập tiêu chuẩn(stdin)
    Khi trên stdin không đủ dữ liệu theo yêu cầu của các hàm, thì máy sẽ tàm dừng để người sử dụng nhập thêm dữ liệu từ bàn phím lên stdin cho đến khi bấm Enter
    Các hàm scanf, gets, getchar, ... thường chỉ nhận đủ số lượng dữ liệu mà nó yêu cầu, kí tự enter và các dữ liệu dư thừa trên dòng nhập tiêu chuẩn không được loại bỏ, nó có thể làm ảnh hưởng đến các phương thức sau đó. Ví dụ như '\n' còn lại sẽ làm trôi dạt gets, và getchar. Để các hàm này hoạt động đúng thì phải khử kí tự '\n' trong hàm scanf() bằng cách thêm đặc tả %*c vào cuối chuỗi điều khiển, hoặc dùng hàm fflush(stdin)
    ffush: f là file, flush là đẩy(ra), loại ra. fflush(stdin) có chức năng làm sạch(tức là xóa) stdin. Dùng hàm này có thể tránh được hậu quả để lại của các thao tác nhập trước đó. fflush() được khai báo trong thư viện chuẩn <stdio.h>
    Bạn có thể xem thêm ở đây
    Một ví dụ nhỏ minh họa cho bạn dễ hiểu. Bạn có thể thử trong trường hợp dùng fflush() và không dùng fflush xem có gì khác nhau nhé:
    HTML Code:
    /* fflush example */ #include <stdio.h> int main() { char ch; char str [100]; printf ("Enter any charater: "); scanf ("%c", &ch); fflush (stdin); printf ("Enter any string: "); gets (str); printf ("%c\n%s", ch, str); return 0; }
    Mời các bạn ghé thăm blog cá nhân của tôi

  3. #3
    Ngày gia nhập
    09 2010
    Nơi ở
    Hà Nôi
    Bài viết
    464

    Mấy giải thích trên của anh khó hiểu quá.
    Dựa vào cái code của anh, em chạy thì em hiểu cũng đc sơ sơ.
    Nếu ko có fflush(stdin) thì ở lênh gets(str) nó lấy luôn giá trị đã nhập ở scanf ("%c", &ch);
    Sao nếu bỏ lệnh fflush(stdin) thì lệnh printf ("%c\n%s", ch, str); lại ko đc thực thi nhỉ? Chương trinhd dừng lại ngay ở dòng lênh nhập giá trị cho str

  4. #4
    Ngày gia nhập
    08 2010
    Nơi ở
    Moscow, Russia Federation
    Bài viết
    913

    Bạn hiểu nhầm rồi, không phải là gets(str) lấy giá trị của scanf(ch) đâu. ở đây mình giải thích cho bạn rõ như thế này. Nếu không dùng fflush(stdin) thì '\n' do lệnh scanf() để lại trên dòng nhập làm trôi dạt phương thức gets() như đã giải thích ở trên, vì thế str sẽ không nhận được giá trị nào hết! Giá trị s in ra ở dòng cuối là do lệnh printf() thực hiện, bạn có thể thay đổi lệnh printf trong chương trình kia thành thế này cho dễ hiểu nhé:
    HTML Code:
    printf ("\n\n%c\n%s", ch, str);
    Mời các bạn ghé thăm blog cá nhân của tôi

  5. #5
    Ngày gia nhập
    12 2009
    Bài viết
    14

    Bạn cứ hiểu là fflush có tác dụng xóa buffer. sau khi gọi nó thì buffer sẽ trống, đảm bảo việc nhập dữ liệu cho các biến sau an toàn.

  6. #6
    Ngày gia nhập
    09 2010
    Nơi ở
    Hà Nôi
    Bài viết
    464

    Mặc định Cách dùng lệnh fflush(stdin)? Lệnh fflush(stdin) có tác dụng gì?

    Em hiểu thê này có đúng ko anh?
    VD: Với code trên ( ko có fflush(stdin) )
    Nếu nhập ở scanf(ch) là 4242 thì ch chỉ nhận giá trị là '4'
    Còn dữ liệu thừa là '242' vẫn còn ở trên stdin.
    Ở lệnh scanf(str) do trên stdin vẫn còn có đủ dữ liệu nên str đc lấy luôn là '242'
    Kết quả chương trình sẽ in ra:


    Ở giải thích của anh em ko hiểu ở thuật ngữ " trôi dạt" và đoạn có chữ " trôi dạt " đó.
    " Nếu không dùng fflush(stdin) thì '\n' do lệnh scanf() để lại trên dòng nhập làm trôi dạt phương thức gets()".
    Tại sao lệnh scanf(ch) ở trên lại để lại '\n'. Em ko hiểu?

  7. #7
    Ngày gia nhập
    12 2009
    Bài viết
    14

    Bạn nhớ rằng '\n' cũng là một ký tự. vậy nên nó cũng là một giá trị có thể lưu vào biến.
    Khi bạn nhập giá trị. bạn sẽ nhấn vào 1 giá trị, và bắt buộc fai? nhấn enter. enter chính là '\n'
    Có nhập chắc chắn fai? có lưu, vậy nó lưu vào đâu, buffer(bộ nhớ đệm).
    Nguyên tắc của scanf là lấy từ buffer trước! nếu ko lấy đc thì mới chờ ng` nhập thêm.
    "__Theo mình nghĩ là vậy. :|" kĩ năng chém gió )

  8. #8
    Ngày gia nhập
    08 2010
    Nơi ở
    Moscow, Russia Federation
    Bài viết
    913

    Trích dẫn Nguyên bản được gửi bởi dehin Xem bài viết
    Em hiểu thê này có đúng ko anh?
    VD: Với code trên ( ko có fflush(stdin) )
    Nếu nhập ở scanf(ch) là 4242 thì ch chỉ nhận giá trị là '4'
    Còn dữ liệu thừa là '242' vẫn còn ở trên stdin.
    Ở lệnh scanf(str) do trên stdin vẫn còn có đủ dữ liệu nên str đc lấy luôn là '242'
    Kết quả chương trình sẽ in ra:


    Ở giải thích của anh em ko hiểu ở thuật ngữ " trôi dạt" và đoạn có chữ " trôi dạt " đó.
    " Nếu không dùng fflush(stdin) thì '\n' do lệnh scanf() để lại trên dòng nhập làm trôi dạt phương thức gets()".
    Tại sao lệnh scanf(ch) ở trên lại để lại '\n'. Em ko hiểu?
    Trôi dạt tức là nó không được thực hiện đó bạn, tức là câu lệnh đó bỏ qua. Bạn hiểu cách thức làm việc của lệnh scanf() không nào? Nó đọc dữ liệu từ dòng nhập chuẩn(tức là bàn phím do bạn gõ vào), đọc đầy dữ liệu thì dừng. '\n' là một dấu hiệu đặc biệt để sanf() dừng đọc dữ liệu. Ví dụ bạn khai báo char str[20]; //tức là một chuỗi chứa được 19 kí tự, nhưng khi thực hiện lệnh scanf("%s",str); mà bạn chỉ nhập vào 12345 rồi bấm enter, thì str = "12345" còn enter sẽ ở lại trên dòng nhập. Trường hợp bạn nhập vào một chuỗi nhiều hơn 19 kí tự thì scanf() đọc hết 19 kí tự và bỏ lại những kí tự thừa trên dòng nhập như trong hình minh họa của bạn. Bạn hiểu như thế là đúng rồi đấy!
    Mời các bạn ghé thăm blog cá nhân của tôi

  9. #9
    Ngày gia nhập
    07 2011
    Nơi ở
    TpHCM
    Bài viết
    1

    Em hiểu thê này có đúng ko anh?
    VD: Với code trên ( ko có fflush(stdin) )
    Nếu nhập ở scanf(ch) là 4242 thì ch chỉ nhận giá trị là '4'
    Còn dữ liệu thừa là '242' vẫn còn ở trên stdin.
    Ở lệnh scanf(str) do trên stdin vẫn còn có đủ dữ liệu nên str đc lấy luôn là '242'
    Kết quả chương trình sẽ in ra:


    Bạn đã hiểu rõ vấn đề rồi đấy.

  10. #10
    Ngày gia nhập
    11 2010
    Bài viết
    589

    theo chuẩn thì fflush chỉ dành cho output stream, dùng để đẩy hết những kí tự có trong buffer ra stream. VD fflush(stdout).
    Chuẩn của C không yêu cầu về fflush sẽ làm gì với input stream, một số implement thì quyết định là nó sẽ xoá sạch buffer, một số thì không làm gì cả.
    Cho nên nếu muốn chương trình chạy được trên nhiều HDH thì không nên xoá buffer bằng lệnh này.

    http://diendan.congdongcviet.com/sho...t=42732&page=2
    www.gidnetwork.com/b-57.html

Các đề tài tương tự

  1. Hàm fflush(stdin) | công dụng của fflush(stdin) như thế nào?
    Gửi bởi sangu trong diễn đàn Thắc mắc lập trình C/C++/C++0x
    Trả lời: 10
    Bài viết cuối: 20-05-2016, 10:06 PM
  2. Lập trình C Giải thích tại sao dùng fflush(stdin)
    Gửi bởi Genky trong diễn đàn Nhập môn lập trình C/C++
    Trả lời: 2
    Bài viết cuối: 14-09-2012, 07:07 PM
  3. Mã nguồn C Lỗi fflush(stdin) vẫn không nhập được. các bạn hãy xem đoạn code sao
    Gửi bởi along1089 trong diễn đàn Thắc mắc lập trình C/C++/C++0x
    Trả lời: 3
    Bài viết cuối: 21-04-2011, 07:44 PM
  4. Cách sử dụng hàm fflush(stdin) như thế nào?
    Gửi bởi vinh312k1 trong diễn đàn Thắc mắc lập trình C/C++/C++0x
    Trả lời: 2
    Bài viết cuối: 15-01-2011, 10:39 PM
  5. Kỹ thuật C hàm flushall & fflush(stdin)
    Gửi bởi t_ily_ht trong diễn đàn Thắc mắc lập trình C/C++/C++0x
    Trả lời: 3
    Bài viết cuối: 10-12-2010, 01:31 AM

Quyền hạn của bạn

  • Bạn không thể gửi đề tài mới
  • Bạn không thể gửi bài trả lời
  • Bạn không thể gửi các đính kèm
  • Bạn không thể chỉnh sửa bài viết của bạn