2009-08-09 135 views

Trả lời

6

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)

+1

Đố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. –

1

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?

+1

bạn có thể đọc từ đầu vào tiêu chuẩn (bảng điều khiển) với fgets. –

20

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.

4
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.

0

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.

0

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.

Các vấn đề liên quan