Tôi muốn biết sự khác biệt giữa fgets()
và scanf()
là gì. Tôi đang sử dụng C làm nền tảng của mình.Sự khác biệt giữa scanf() và fgets()
Trả lời
Quét không kiểm tra giới hạn. fgets có thể sẽ là lựa chọn tốt hơn. Sau đó bạn có thể sử dụng sscanf() để đánh giá nó.
thảo luận tốt về chủ đề ở đây, http://cboard.cprogramming.com/c-programming/109243-scanf-vs-fgets.html
How do you allow spaces to be entered using scanf? (Đó là evil twin tôi nhận giảng dạy cho quên this- không phải tôi)
scanf phân tích một chuỗi bạn đọc (hoặc tạo), và fgets đọc một dòng từ một FILE mở *. Hay bạn có nghĩa là fscanf?
bạn có thể đọc từ đầu vào tiêu chuẩn (bảng điều khiển) với fgets. –
Có nhiều điểm khác biệt. Hai yếu tố quan trọng là:
fgets()
có thể đọc từ mọi tệp đang mở, nhưng chỉ đọc đầu vào tiêu chuẩn.fgets()
đọc 'một dòng văn bản' từ một tệp;scanf()
có thể được sử dụng cho điều đó nhưng cũng xử lý các chuyển đổi từ chuỗi thành các loại số.
Nhiều người sẽ sử dụng fgets()
để đọc một dòng dữ liệu và sau đó sử dụng sscanf()
để phân tích.
int scanf(const char * restrict format, ...);
scanf (3) tìm kiếm đối với một số mẫu xác định bởi các tham số định dạng vào đầu vào được gọi là stdin, nơi mà các mô hình được xác định bởi bạn. Dữ liệu nhập vào cho scanf (3), tùy thuộc vào biến thể của nó (scanf, fscanf, sscanf, vscanf, vsscanf, vfscanf), có thể là một chuỗi hoặc một tệp.
char *fgets(char * restrict str, int size, FILE * restrict stream);
fgets (3) chỉ đọc một dòng từ tập tin đầu vào dòng và sao chép các byte chuỗi chấm dứt như null để bộ đệm str và hạn chế sản lượng để bộ đệm để byte cho ở kích thước.
Sự khác biệt chính nằm trong thực tế rằng scanf
không có giới hạn về số lượng ký tự có thể được đọc (được sử dụng mặc định của nó), trong khi fgets
có một số lượng tối đa char có thể được đọc.
Xem nguyên mẫu của hai chức năng:
char * fgets (char * dest, int size, FILE * stream);
int scanf (const char * format, ...);
Bạn có thể thấy tham số thứ hai là fgets
áp đặt để đọc ở kích thước lớn nhất.
Một điểm khác biệt rõ ràng là giá trị trả về: fgets
trở lại một con trỏ đến dest
trên thành công; scanf
trả về số lượng mục nhập được kết hợp thành công và được gán. Sau đó, scanf chức năng quét đầu vào theo định dạng, và đọc từ đầu vào tiêu chuẩn input stream stdin, trong khi fgets
lần đọc đầu vào từ FILE * stream như mặc định.
Tóm lại, bạn có thể sử dụng scanf
để đọc dữ liệu từ một TẬP_TIN và chèn chúng vào một mảng có kích thước cố định (ví dụ) không có nhiều ý nghĩa. Lợi thế của scanf
là định dạng dữ liệu đầu ra: nếu chức năng đọc 12345\n
, đầu ra là 12345
, trong khi số lần đọc và trả về cho đến \n
(bao gồm), thêm \0
vào cuối.
Cần lưu ý rằng scanf
mô hình thông số kỹ thuật làm cho phép giới hạn chiều rộng lĩnh vực:
scanf(" %80s", mybuffer);
Nhưng, nơi printf()
cho phép chiều rộng được thông qua như là một biến (với '*'):
printf("My name is %*s.\n", 20, name);
scanf()
thì không. (Nó diễn giải '*' như một lá cờ để ngăn chặn/bỏ qua lĩnh vực hoàn toàn.) Có nghĩa là bạn kết thúc làm việc như thế này:
#define NAMEWIDTH 40
char buffer[ NAMEWIDTH + 4 ];
...
scanf(" %40x", buffer);
và không có cách nào để kết nối lĩnh vực này rộng 40 trong scanf()
với đệm rộng 40 trong khai báo bộ đệm.
- 1. Sự khác biệt giữa fgets và fscanf?
- 2. Sự khác biệt giữa $ (...) và `...`
- 3. Sự khác biệt giữa. và #
- 4. Sự khác biệt giữa $ * và $ @
- 5. Sự khác biệt giữa ". +" Và ". +?"
- 6. Sự khác biệt giữa "**/* /" và "** /"?
- 7. Sự khác biệt giữa = và: =
- 8. Sự khác nhau giữa scanf ("% c", & c) và scanf ("% c", & c)
- 9. Sự khác biệt về sự khác biệt giữa Matplotlib giữa Agg và Cairo
- 10. Sự khác biệt giữa Html.RenderAction và Html.Action
- 11. Sự khác biệt giữa cookie và phiên?
- 12. Sự khác biệt giữa '.' và "." trong java
- 13. Sự khác biệt giữa SimpleDB và S3
- 14. C++ - Sự khác biệt giữa (*). và ->?
- 15. Sự khác biệt giữa offsetHeight và clientHeight
- 16. Sự khác biệt giữa RDLC và SSRS
- 17. Sự khác biệt giữa "\ n" và Environment.NewLine
- 18. Sự khác biệt giữa qt và PyQt4
- 19. Sự khác biệt giữa AForge và OpenCV
- 20. Sự khác biệt giữa toFixed() và toPrecision()?
- 21. sự khác biệt giữa cacao và cocoatouch
- 22. Sự khác biệt giữa smtpClient.send() và smtpClient.SendAsync()?
- 23. Sự khác biệt giữa window.location.host và window.location.hostname
- 24. Sự khác biệt giữa DTLS và TLS
- 25. Sự khác biệt giữa Mealy và Moore
- 26. sự khác biệt giữa createRfcommSocketToServiceRecord và createRfcommSocket
- 27. Sự khác biệt giữa Arrays.sort() và Arrays.parallelSort()
- 28. sự khác biệt giữa orm và pdo
- 29. Sự khác biệt giữa nproc và ulimit?
- 30. Sự khác biệt giữa apc_add và apc_store?
Đối với các loại số, scanf() không cần kiểm tra giới hạn. Đối với các loại chuỗi, bạn có thể yêu cầu scanf() thực hiện kiểm tra ranh giới. –