2012-11-23 54 views
12

我知道printf返回一個負面錯誤或成功打印的字符數。只有理由檢查此返回值是否程序的執行取決於printf狀態。但我想不出這種返回值有用的場景。例如,我從來沒有檢查過printf函數的返回值。爲什麼printf返回一個值?

printf返回狀態有用的情況有哪些?

回答

0

我也從未使用過返回值。 但在錯誤檢查旁邊,您可能會計算已輸出的字符數,以進行某種統計或限制

1

它主要用於錯誤檢查。您可以使用返回值確保操作成功或不成功。

如果返回非負值(表示寫入的字符數),則表示操作成功。如果返回負數,則出現一些錯誤。

例如,

#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

其中一個主要的原因,這是使用用於故障排除。 Printf可以用來寫入文件(不僅是標準輸出)。確保所有文字都寫在文件中對於某些應用程序至關重要。一個例子可以在下面找到:

#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; 
} 

你可能會問你爲什麼要用printf來打印文件。考慮這一點。一些軟件的開發沒有實現錯誤日誌記錄,而是使用了printf。知識豐富的C程序員可以將printf的輸出重定向到代碼頂部的文件,從而實現將錯誤記錄到文件而不是STDOUT。在這一點上,他可以使用printf的返回值來確保這些錯誤被正確打印。

+0

這是一個糟糕的例子,其中printf()的返回值被檢查! – AlexWien

0

在某些情況下,printf只能將您的字符串的一部分放入stdout,而這不是錯誤。

如果您必須確保您的字符串發送完成,則可以使用返回值來查看此信息。

其最適用於與fprintf和插座等工作,但仍然可能是有用的。

5

有幾種情況可能需要檢查printf的返回值。其中之一就是檢查錯誤,正如你提到的那樣;如果printf出現錯誤,通常沒有辦法做到這一點,但是如果您打印的內容真的很大,並且出現錯誤,請嘗試將它打印成小塊。

您可能還對產量有多大感興趣; printf()返回成功寫入的字符數。如果您嘗試排列輸出,並且您使用寬度可變的東西執行printf(),則可以檢查返回值以查明打印了多少個字符,以便知道您所在的列。當然,只有當你的所有字符都是1列寬(大多數ASCII字符都是如此)時,這纔有效,但在某些情況下這可能會有用。

snprintf()打印到固定大小的緩衝區而不是標準輸出或文件。它只會打印到您提供的緩衝區的大小;但可能需要更多空間來打印完整的字符串。它返回打印完整字符串所需的空間量;這樣,您可以使用返回值分配適當大小的新緩衝區,如果原始緩衝區太小,請重試。出於這個原因,您幾乎總是使用返回值snprintf()

16

還有的printf返回值的至少2個用途:

  1. 檢查錯誤。當您的輸出是交互式或純粹的信息時,這很少重要,但對於正在處理來自stdio或文件的文本並將結果寫入標準輸出的程序,重要的是要知道錯誤(例如磁盤已滿,已關閉管道或已丟棄網絡連接)阻止了整個輸出的寫入。如果在輸出完成後源文件將被刪除/替換爲輸出,這一點尤其重要。但是,由於緩衝,檢查printf本身的結果通常沒有幫助。在寫入最後一個輸出和刷新之後,您需要檢查ferror(stdout)以獲得是否發生任何寫入錯誤的可靠指示。另一方面,檢查返回值printf允許您檢測到故障早期,因此您不會浪費時間在第一行失敗時嘗試寫入數百萬行,因此這可能是非常有用的檢查;它本身並不是一個足夠的檢查。

  2. 如果輸出的字符數不明顯,您可能想知道已寫入了多少個字符。這個數字的天真使用將用於排列列,但假設角色在其視覺呈現中具有固定的寬度是過時的。不過,如果您要格式化源代碼,則可能有意義。另一個類似的用法(不確定這是否過時或過時)是在文件中寫入固定寬度的字段。例如,如果你的字段是80個字節,並且printf返回52,你希望再寫入28個填充字節來結束這個字段。