30/09/2018, 16:08

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:

Cho em hỏi sao lúc in ra màn hình console, nó không ghi tên em, nó chỉ ghi tên xong bỏ luôn phần em mới điền vào cụ thể: em điền 14 9 long gioi a ra màn hình console cái printf cuối nó ghi:ban 14, lop 9, ten , hoc luc gioi, thich chu a #include <stdio.h> #include <stdlib.h> int main() { int tuoi, lop; char ten[10]; char hocluc[4]; char kytu; printf("ban bao nhieu tuoi, lop may, ten gi, hoc luc gi, thich chu gi"); scanf("%d %d", &tuoi, &lop); scanf("%s", ten); …

Đạ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?

... viết 18:09 ngày 30/09/2018

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.

Minh Hoàng viết 18:14 ngày 30/09/2018

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

Gió viết 18:12 ngày 30/09/2018

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 )
Bài liên quan
0