Cách dùng fgets thay vì dùng scanf để nhập vào chuỗi trong C

Từ bài @nhatlonggunz hỏi ở đây [Video] Ngôn Ngữ C - 24 - Hàm nhập vào từ bàn phím, scanf:

Đạt đã trả lời ở đây

Nhưng mà Đạt chưa hướng dẫn cách sử dụng hàm fgets một cách chi tiết. Nhiều bạn mới học hay dùng scanf để nhập chuỗi. Nhưng đó không phải là cách đúng để nhập chuỗi.

Có bạn nào có thể giúp mình giải thích cách sử dụng hàm fgets không?

7 Likes

Thôi thì vô cplusplus coi cho lẹ: http://www.cplusplus.com/reference/cstdio/fgets/

char* fgets ( char* str, int num, FILE * stream );

Đọc kí tự từ stream và lưu vào chuỗi (kiểu trong C), tham số thứ 2 là số kí tự sẽ đọc (từ 0 đến num-1), tham số thứ 3 mặc định là file stdin (đọc từ file khác thì bỏ link file vào đó).

Thông thường mấy bạn mới học chỉ dùng mỗi tham số thứ 1 cho hàm fgets nên cứ nghĩ fgets chỉ cần 1 tham số là cái chuỗi cần đọc dữ liệu vào từ bàn phím.

The C library function char *fgets(char *str, int n, FILE *stream) reads a line from the specified stream and stores it into the string pointed to by str. It stops when either (n-1) characters are read, the newline character is read, or the end-of-file is reached, whichever comes first.

3 điều kiện dừng thôi :smiley:

1 Like

Hàm fgets có dạng char * fgets( char * s, int limit, FILE * stream)

  • fgets sẽ đọc vào một chuỗi giới hạn bởi ‘\n’ hoặc limit -1 kí tự
  • nếu kết thúc stream, sẽ trả về NULL hoặc không trả về s

khác biệt scanf và fgets:

  • fgets an toàn hơn do không bao giờ đọc quá kích thước đã cấp phát trong limit.
  • fgets sẽ đọc cả kí tự trắng , trong ki scanf ("%s") dừng lại ki gặp kí tự trắng.

hạn chế:

  • fgets đọc dữ liệu như vậy đòi hỏi bạn phải xứ lí thêm ví dụ như trim whitespace …
  • scanf thì bạn chỉ cần khai báo xâu có độ dài lớn hơn chuỗi cần đọc là dc. (Bình thường vẫn thích dùng scanf hoặc getline hơn :slight_smile: )
5 Likes
83% thành viên diễn đàn không hỏi bài tập, còn bạn thì sao?