2012-11-23 46 views
12

Tôi biết rằng printf trả về lỗi âm hoặc số ký tự được in thành công. Chỉ có lý do để kiểm tra giá trị trả lại này là nếu việc thực hiện chương trình bằng cách nào đó phụ thuộc vào trạng thái printf. Nhưng tôi không thể nghĩ ra một kịch bản mà giá trị trả lại này hữu ích. Tôi, đối với một, chưa bao giờ kiểm tra giá trị trả về của hàm printf.Tại sao printf trả về một giá trị?

Các tình huống mà trạng thái trả về từ printf là gì?

Trả lời

0

Tôi cũng chưa bao giờ sử dụng giá trị trả lại. Nhưng bên cạnh kiểm tra lỗi, bạn có thể đếm số ký tự đã xuất, để thực hiện một số loại thống kê hoặc giới hạn

1

Chủ yếu là nhằm mục đích kiểm tra lỗi. Bạn có thể đảm bảo rằng thao tác thành công hoặc không sử dụng giá trị trả lại.

Nếu giá trị không âm được trả về (cho biết số ký tự được viết) có nghĩa là thao tác đã thành công. Nếu một số âm được trả lại thì có một số lỗi.

Ví dụ,

#include <stdio.h> 
#include <stdlib.h> 

int main(void) 
{ 
    int result = printf("This is a test!"); 
    if (result > 0) 
    { 
     printf("%d characters were written!", result); 
     return EXIT_SUCCESS; 
    } 
    else return EXIT_FAILURE; 
} 
2

Một trong những lý do chính tại sao điều này được sử dụng là để gỡ rối. Printf có thể được sử dụng để ghi vào một tập tin (không chỉ STDOUT). Đảm bảo rằng tất cả các charachters đã được viết vào tập tin là rất quan trọng trong một số ứng dụng. Bạn có thể tìm thấy ví dụ về điều này bên dưới:

#include <stdio.h> 
#include <stdlib.h> 

int main(void) 
{ 
    FILE *fp; 

    printf("This will display on the screen.\n"); 

    if((fp=freopen("OUT", "w" ,stdout))==NULL) { 
    printf("Cannot open file.\n"); 
    exit(1); 
    } 

    if(printf("This will be written to the file OUT.") < 0){ 
     return -1; 
    } 

    fclose(fp); 

    return 0; 
} 

Bạn có thể hỏi tại sao bạn nên sử dụng printf để in tệp. Xem xét điều này. Một số phần mềm đã được phát triển mà không có lỗi đăng nhập thực hiện nhưng thay vì sử dụng printf. Một lập trình viên có kiến ​​thức C có thể chuyển hướng đầu ra của printf tới một tệp ở đầu mã và do đó thực hiện ghi nhật ký lỗi cho một tệp thay vì STDOUT. Tại thời điểm này, ông có thể sử dụng giá trị trả về của printf để đảm bảo rằng các lỗi này được in chính xác.

+0

Đây là ví dụ không đúng, giá trị trả về của printf() đã được kiểm tra ở đâu! – AlexWien

0

trong một số trường hợp, printf chỉ có thể đặt một phần chuỗi của bạn vào chế độ xuất chuẩn và đây không phải là lỗi.

nếu bạn phải chắc chắn rằng chuỗi của bạn được hoàn thành, bạn có thể sử dụng giá trị trả lại để xem điều này.

MOS của nó hữu ích khi làm việc với fprintf và ổ cắm, v.v. nhưng vẫn có thể hữu ích.

5

Có một vài tình huống mà bạn có thể muốn kiểm tra giá trị trả về của printf. Một là để kiểm tra lỗi, như bạn đề cập đến; trong khi thường không có gì bạn có thể làm nếu có một lỗi trên printf, bạn có thể, nếu bạn đang in một cái gì đó thực sự lớn, và nhận được một lỗi, quyết định thử in nó trong khối nhỏ hơn.

Bạn cũng có thể quan tâm đến độ rộng của đầu ra; printf() trả về số ký tự được viết thành công. Nếu bạn đang cố gắng xếp hàng đầu ra, và bạn thực hiện printf() với thứ gì đó có chiều rộng thay đổi, bạn có thể kiểm tra giá trị trả về để tìm hiểu số lượng ký tự được in, vì vậy bạn biết bạn đang ở cột nào. Tất nhiên, điều này chỉ hoạt động nếu tất cả các ký tự của bạn là 1 cột rộng (đúng với hầu hết các ký tự ASCII), nhưng có một số trường hợp trong đó điều này có thể hữu ích.

snprintf() in bằng bộ đệm có kích thước cố định thay vì stdout hoặc tệp.Nó sẽ chỉ in lên đến kích thước của bộ đệm mà bạn cho nó; nhưng có thể nó sẽ đòi hỏi nhiều không gian hơn để in chuỗi đầy đủ. Nó trả về lượng không gian cần thiết để in chuỗi đầy đủ; theo cách này, bạn có thể sử dụng giá trị trả về để cấp phát bộ đệm mới có kích thước phù hợp và thử lại nếu bộ đệm ban đầu của bạn quá nhỏ. Bạn hầu như luôn luôn sử dụng giá trị trả lại là snprintf(), vì lý do này.

16

Có ít nhất 2 công dụng của giá trị trả về của printf:

  1. Để kiểm tra lỗi. Điều này hiếm khi quan trọng khi đầu ra của bạn tương tác hoặc hoàn toàn thông tin, nhưng đối với các chương trình xử lý văn bản từ stdio hoặc một tệp và ghi kết quả vào stdout, điều quan trọng là phải biết liệu có lỗi hay không. kết nối mạng) ngăn không cho toàn bộ đầu ra được ghi. Điều này đặc biệt quan trọng nếu tệp nguồn sẽ bị xóa/thay thế bởi đầu ra khi đầu ra hoàn tất. Tuy nhiên, do đệm, kiểm tra kết quả của printf chính nó thường không hữu ích. Bạn sẽ muốn kiểm tra ferror(stdout) sau khi viết đầu ra cuối cùng và đỏ bừng để có được một dấu hiệu đáng tin cậy cho dù có bất kỳ lỗi ghi nào đã xảy ra hay không. Mặt khác, kiểm tra giá trị trả lại của printf cho phép bạn phát hiện lỗi đầu để bạn không lãng phí thời gian cố gắng viết hàng triệu dòng khi dòng đầu tiên không thành công, vì vậy nó có thể là một kiểm tra rất hữu ích; nó không phải là một kiểm tra đầy đủ của chính nó.

  2. Nếu số lượng đầu ra ký tự không rõ ràng, bạn có thể muốn biết có bao nhiêu ký tự được viết. Một cách sử dụng ngây thơ của con số này sẽ là để xếp hàng các cột, nhưng giả sử các ký tự có chiều rộng cố định trong bản trình bày trực quan của họ là khá cổ. Nó có thể có ý nghĩa nếu bạn đang định dạng mã nguồn, mặc dù. Một cách sử dụng tương tự khác (không chắc chắn liệu điều này là ít hoặc nhiều hơn cổ) đang viết các trường có chiều rộng cố định trong một tệp. Ví dụ: nếu các trường của bạn là 80 byte và printf trả về 52, bạn muốn viết thêm 28 byte đệm để kết thúc trường.

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